POSIX РЕЗЬБЫ:
У меня есть две функции, которые вызываются с использованием двух разных потоков. В теме использую условное ожидание
а в других посылаю сигнал состояния.
Поскольку любой поток может выполняться раньше, поэтому сигнал может быть отправлен, даже если ожидание не было вызвано.
Я хочу сохранить сигнал, который был отправлен, чтобы другой поток того же процесса при ожидании вызовов мог использовать тот сигнал, который был вызван ранее. Есть ли способ сделать это в POSIX?
Сигналы переменной условия POSIX теряются, если нет официантов. Кроме того, ложные сигналы могут заканчиваться преждевременно. Вот почему всегда следует ждать изменения состояния в while
цикл, а не только сигнал переменной состояния.
Для вашей конкретной задачи вы, вероятно, можете использовать что-то вроде семафор.
Одного условия ожидания недостаточно для синхронизации потоков. Как уже сказал Максим, сигналы могут быть потеряны или могут быть отправлены без причины.
Вам нужна дополнительная информация для передачи между потоками. Обычно это делается с помощью очереди. Но в простых случаях, когда нужен только триггер, int
в качестве счетчика может быть достаточно.
Это выглядит примерно так:
отправитель:
get_lock();
counter++;
release_lock();
получатель:
while(1){
get_lock();
while(counter==0)
wait_on_lock();
counter--;
release_lock();
do_work();
}