Здравствуйте, enji, Вы писали:
E>Здравствуйте
E>Читаю доку boost::thread и не пойму, почему condition_variable сделан именно так.
E>Хочется чего-то вроде обычного event, с примерно таким использованием:
E>
E>Как-то очень многословно получается... Зачем вообще такая "сложная" схема применения нужна? Или я чего-то не понимаю — наставьте на путь истинный
E>Спасибо!
Можешь сделать обертку Event надо condition variable.
Condition variable гибче.
E>event evl;
E>void thread1()
E>{
E> // готовим какие-то данные <-- здесь
E> ev1.raise();
E>}
E>void thread2()
E>{
E> ev1.wait();
E> // данные готовы <--- и здесь может быть одновременный доступ к одному и отму же ресурсу (данным)
E>}
E>
Например, когда 2 поток данные еще не успел обработать, а первый начал уже готовить новые
E>Однако с использованием condition_variable это превращается в: E>
.
А как будет выглядеть пример с использованием event? Потребуется второй объект event?
З.Ы. И в обоих таких случаях получается отсутствие распараллеливания. Каждый поток сначала ждет другой, чтобы выполнить свою работу. Очередь сразу напрашивается.
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, enji, Вы писали:
E>>Хочется чего-то вроде обычного event, с примерно таким использованием:
U>лучшие собаководы рекомендуют такой подход (метакод):
у этого подхода есть нюанс : кол-во Set не гарантирует столько же отпусканий ждущих потоков
то есть если у вас есть 2 ждущих потока, и вы делаете из третьего два раза Set, то не гарантировано, что оба ждущих потока пройдут
как я понимаю, аналогичное поведение у виндового Event-а
Здравствуйте, uzhas, Вы писали:
U>то есть если у вас есть 2 ждущих потока, и вы делаете из третьего два раза Set, то не гарантировано, что оба ждущих потока пройдут
это в том случае, если в третьем потоке вызвался второй Set до того как один из ждущих успел проснуться? Эта ситауция эквивалента такому вызову:
Здравствуйте, kvser, Вы писали:
K>Это возможно, если количество вызовов notify_one() не гарантирует такое же количество просыпаний
да, я ошибся
нюанс не относится к Event-у
Здравствуйте, uzhas, Вы писали: K>>Это возможно, если количество вызовов notify_one() не гарантирует такое же количество просыпаний U>да, я ошибся
не ошибся
потоки проснуться, один из них захватит мьютекс(другой будет заблокирован в ожидании мьютекса), переменной IsSet присвоит false и освободит мьютекс. Далее другой захватит мьютекс, проверит условие !IsSet, которое окажется верным, и опять уйдет в ожидание в wait()