Проблема сигнализации условий - PullRequest
2 голосов
/ 04 августа 2011

Я в супе. Идея может быть плохой, но мне нужно решение.

  • У меня есть две переменные условия, скажем, A и B.

  • Потоки 1, 2 и 3 ожидают на A. Поток 4 ожидает на B.

  • B будет pthread_cond-signal () потоком 2, то есть поток 4 будет проснулся, чтобы проснуться потоком 2.

Теперь у меня есть другой поток 5, который pthread_cond_broadcasts () для условной переменной A. Мне нужны все потоки 1, 2 и 3, чтобы проснуться до того, как проснется поток 4. То есть, если поток 2 просыпается и сигналы в потоке B 4 могут просыпаться раньше, чем поток 3, а это не то, чего я хочу.

Любые указатели будут высоко оценены.

спасибо

Ответы [ 3 ]

2 голосов
/ 04 августа 2011

Вы можете решить эту проблему с помощью условных переменных. Вместо того, чтобы поток 4 ожидал только условия, заданного потоком 2, он должен ожидать условия, которое устанавливается только после того, как все потока 1, потока 2 и потока 3 выполнили свою задачу:

pthread_mutex_lock(&thread4_lock);
while (!thread1_flag || !thread2_flag || !thread3_flag)
    pthread_cond_wait(&thread4_cond, &thread4_lock);
pthread_mutex_unlock(&thread4_lock);

/* Thread 4 can continue */

Когда поток 1 выполнил свою задачу, он устанавливает свою часть условия:

pthread_mutex_lock(&thread4_lock);
thread1_flag = 1;
pthread_cond_signal(&thread4_cond);
pthread_mutex_unlock(&thread4_lock);

... и аналогично для потоков 2 и 3. Поток 4 продолжится только после установки всех флагов.

1 голос
/ 04 августа 2011

Используйте семафор : пусть каждый из потоков 1-3 публикует семафор, а поток 4 ожидает семафора 3 раза вместо переменной условия.

Вы будетехотите использовать sem_init(3) или sem_open(3) для создания семафора, sem_post(3) для публикации семафора, sem_wait(3)ждать на семафоре, а затем либо sem_destroy(3) (если создано с помощью sem_init) или sem_close(3) и sem_unlink(3) (если создано с помощьюsem_open) чтобы уничтожить семафор.

0 голосов
/ 04 августа 2011

Рассмотрите возможность использования для этого внутрипроцессной сигнализации ZeroMQ.ZeroMQ реализует модель обмена сообщениями, которая может эффективно использоваться для координации потоков, а также для межпроцессного или сетевого обмена сообщениями.

Для получения дополнительной информации: http://api.zeromq.org/2-1-1:zmq-inproc

Вот пример распределения нагрузки между потоками с использованием ZeroMQ и Java.

...