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-х бит слева направо, кто ж знает? Поэтому защищать надо и чтение и запись. Некоторые просто в этом примере утверждают, что чтение можно не защищать. И даже иногда бывают такие варианты ответов в тестах, которые не предполагают защиты чтения...

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

На джава synchronized(counter) { if(counter == 10) return; ++counter; } Или в зависимости от логики отдельно два раза synchronized() ...

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

synchronized для такой задачи избыточен, слишком большой overhead

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

это не говоря уже про то, что synchronized(counter) не скомпилится (если counter типа int), либо не будет корректно работать (если counter типа Integer)

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

а ну да, только же с объектами работает...

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