Поведение EventWaitHandle для pthread_cond_t - PullRequest
1 голос
/ 27 сентября 2008

Я недавно увидел свет мощного поведения EventWaitHandle в C # и решил перенести некоторые функции в родственные приложения, чтобы сделать то же самое. Единственная проблема в том, что сестринское приложение написано на C.

Ничего страшного, я использую pthreads, которые имеют тип данных pthread_cond_t, который позволяет передавать сигналы. Мой единственный вопрос: возможно ли, чтобы cond был «сигнализирован» до того, как что-то его ждет?

Прямо сейчас мое тестирование говорит нет. То есть, если ThreadA генерирует сигнал до того, как ThreadB ожидает, ThreadB будет ждать неопределенно долго. Есть ли другой тип pthread, который я могу использовать, который ведет себя ближе к функциональности EventWaitHandle в C #? Объект получает сигнал, что означает, что первый поток, ожидающий его, немедленно пройдет и установит для него значение unsignalled.

Внедрение pthread_cond в другую структуру данных не будет слишком сложным для достижения этой цели. Но опять же, эта функция уже доступна в библиотеке pthread?

Ответы [ 3 ]

4 голосов
/ 27 сентября 2008

Если вы правильно используете условные переменные, это не имеет значения.

Основной поток вашего кода должен быть (в псевдокоде):

lock(lockobj);
while (!signalled) {
    wait(condvar);
}
signalled = false;
unlock(lockobj);

на стороне ожидания и:

lock(lockobj);
signalled = true;
notify(condvar);
unlock(lockobj);

на стороне сигнализации. (Конечно, используемый объект блокировки и переменная условия должны быть одинаковыми с обеих сторон.) Надеюсь, это поможет!

0 голосов
/ 29 сентября 2008

В итоге я просто обернул тип условия в новую структуру и создал несколько простых функций, которые будут вести себя подобно EventWaitHandle из C #. Мне понадобились два мьютекса для получения правильного сериализованного доступа.

cond_mutex используется для ожидания условной переменной, в то время как data_mutex используется при установке состояния из сигнализированного в не сигнализированное.

Режим сброса такой же, как в C #. АВТО или РУКОВОДСТВО. Это позволяет event_wait_t автоматически сбрасываться после ожидания. Или позволить программисту вручную сделать это с помощью вызова event_wait_reset (event_wait_t * ewh);

0 голосов
/ 27 сентября 2008

Альтернативный ответ (также в псевдокоде), если вы хотите несколько сигнализаций (т. Е. Если сигнализировано дважды, то два потока могут ждать, пока состояние снова не будет сигнализировано).

Ожидание:

lock(lockobj);
while (signalled != 0) {
    wait(condvar);
}
--signalled;
unlock(lockobj);

Сторона сигнализации:

lock(lockobj);
++signalled;
notify(condvar);
unlock(lockobj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...