LINUX.ORG.RU

Простая задачка с собеседований. О тредах.


0

1

Типа, какие операции нужно защитить от выполнения параллельно в нескольких потоках. Код:

if ( 10 == counter ) return;
   ++counter;

Насколько я понимаю, делать надо так:

mutex.lock();
if ( 10 == counter )
{
   mutex.unlock();
   return;
}
++counter;
mutex.unlock();

Нельзя ведь считать, что 10 == counter выполняется за 1 такт или ++counter за 1 такт. Кто знает что это за процессор и во что компилятор скомпилировал выражение «++counter;»? Вдруг запись выполняется извращенческим способом в 32 такта последовательным сдвигом 32-х бит слева направо, кто ж знает? Поэтому защищать надо и чтение и запись. Некоторые просто в этом примере утверждают, что чтение можно не защищать. И даже иногда бывают такие варианты ответов в тестах, которые не предполагают защиты чтения...

Ответ на: комментарий от dave

Покажи мне, каким способом обеспечивается гарантия консистентности данных и сериализация доступа к 'counter'.

Или другими словами, где гарантия, что 'counter' не будет изменён после проверки?

Rzhepish
()
Ответ на: комментарий от Rzhepish

Там же блокировка между двумя проверками - вот и гарант.

yoghurt ★★★★★
()

Как же трудно все делать руками. Всем ЛОРом решать, какие поставить мьютексы, взять ли CAS, использовать ли барьеры памяти. Вместо того, чтобы просто написать

atomically $ do
  x <- readTVar var
  when (x /= 10) $ writeTVar var (succ x)

и заниматься дальше чем-нибудь другим.

anonymous
()
Ответ на: комментарий от anonymous

заниматься дальше чем-нибудь другим.

Например, обсудить на лоре, какие поставить мьютексы, взять ли CAS, использовать ли барьеры памяти...

LamerOk ★★★★★
()
Ответ на: комментарий от Rzhepish

а теперь подумай, почему мьютексы через futex реализованы ололо

ckotinko ☆☆☆
()
Ответ на: комментарий от Boy_from_Jungle

Чудо-юдо из леса, быстренько почитай, что такое модификатор volatile и удали свой бред из темы.

anonymous
()
Ответ на: комментарий от anonymous

Ну чего ты лезешь со своим хаскеллем, тебе что, больше нечего делать, негде применить свой мэдскиллз и написать что-нить полезное?

anonymous
()
Ответ на: комментарий от anonymous

По теме сказать нечего? Вполне ожидаемо.

Заметь, что в стартовом посте никто не ограничивал в выборе ЯП, вопрос там про многонитевое пр-ие.

anonymous
()
Ответ на: комментарий от anonymous

> Заметь, что в стартовом посте никто не ограничивал в выборе ЯП, вопрос там про многонитевое пр-ие.

Распечатай 20 кеглем:

if ( 10 == counter ) return;

++counter;

И дальше долго изучай. Глядишь, лет через 5 придёшь к выводу, что это - не хаскель. И не ассемблер.

anonymous
()
Ответ на: комментарий от anonymous

> По теме сказать нечего? Вполне ожидаемо.

По теме — шел бы ты писать на своём хаскеле что-нибудь полезное.

Я упорно верю, что это возможно, но ситуация выходит как с философией и историей — получившие образование максимум что могут сделать, так это учить других людей философии и истории. С хаскелем то же самое — максимум сможешь написать пару бесполезных библиотек на хаскеле, коими завален хэкэдж.

anonymous
()
Ответ на: комментарий от anonymous

Тащемта уже написал. И буду еще писать. Но при чем тут это в данный момент — совершенно не ясно.

anonymous
()
Ответ на: комментарий от anonymous

Тащемта уже написал. И буду еще писать. Но при чем тут это в данный момент — совершенно не ясно.

Что писал? Очередной полезный хэлоу-ворлд?

anonymous
()
Ответ на: комментарий от anonymous

Если в стартовом посте пример кода написан на одном языке, другие языки брать нельзя?

Задачу осмыслить не смог?

anonymous
()
Ответ на: комментарий от anonymous

Очередной полезный тренажер самолета.

anonymous
()
Ответ на: комментарий от anonymous

Вполне смог, в отличии от некоторых.

anonymous
()
Ответ на: комментарий от anonymous

Кстати, на всякий случай, перечитай мой начальный пост. Может догадаешься, в чем поинт.

anonymous
()
4 мая 2012 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.