LINUX.ORG.RU

Условные переменные


0

0

Расскажите популярно, пожалуйста, про условные переменные в тредах и мьютексах. До сих пор не могу понять что это такое и как их использовать :(.

Спасибо.

anonymous

Если на примере Жабы то это просто способ не вешать все трэды, а 
только часть их. Например:

lock = new ReentrantLock();
cond1 = lock.newCondition();
cond2 = lock.newCondition();

Один трэл мог бы делать:

while (условие1)
   cond1.await()

а другой

while (условие2)
   cond2.await()

Теперь какой-то третий трэд мог бы делать

if (первый_трэд_уже_может_работать)
   cond1.signal(); // разбуди его
if (второй_трэд_уже_может_работать)
   cond2.signal(); // разбуди его

Если множество трэдов ждет на условной переменной

for (...)
   new Thread() {
      ...
      while (условие1)
        cond1.await()
   }.start()

То можно их разбудить всех при помощи

cond1.signalAll();

При этом трэды висящие на cond2 не будут затронуты.

await() засунута в while потому что в Жабе трэды могут выходить из 
await() ни с того ни с сего.

Другими словами в Жабе условные переменные это просто этакие семафоры 
без всякого числа (бинарные). То есть просто обычные мутексы (локи) 
только с этаким unlockAll().

В других языках должно быть похоже. Вернее наоборот это в Жабе похоже 
на другие языки.

Если где ошибаюсь прошу поправить.

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