pthread_singal пробуждает более одного потока в многопроцессорной системе - PullRequest
1 голос
/ 17 февраля 2011

Это выдержка из справочной страницы pthread_cond_wait. Некоторые реализации, особенно на многопроцессорных системах, могут иногда вызывать пробуждение нескольких потоков, когда переменная условия сигнализируется одновременно на разных процессорах.

ВВ общем, всякий раз, когда возвращается ожидание условия, поток должен переоценить предикат , связанный с ожиданием условия, чтобы определить, может ли оно безопасно продолжаться, следует ли ждать снова или объявить тайм-аут.Мой вопрос: здесь, что означает предикат? Означает ли это, что мне нужно создать еще одну переменную помимо условной переменной, предоставленной в pthread_cond_wait , или она ссылается на ту же переменную, которая была предоставлена ​​в pthread_cond_wait

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

Это может быть полезно. Вы можете использовать pthread_kill для пробуждения определенного потока.

sigset_t _fSigMask; // global sigmask

Мы делаем это перед созданием наших тем. Потоки наследуют свою маску от потока, который их создает. Мы используем SIGUSR1, чтобы сигнализировать наши темы. Другие сигналы доступны.

sigemptyset(&_fSigMask);
sigaddset(&_fSigMask, SIGUSR1);
sigaddset(&_fSigMask, SIGSEGV);

Тогда спать нить

int nSig;
sigwait(&fSigMask, &nSig);

Затем, чтобы разбудить нить, YourThread.

pthread_kill(YourThread, SIGUSR1);

Кстати, во время нашего тестирования сон и пробуждение наших потоков таким образом было примерно в 40 раз быстрее, чем использование условных переменных.

1 голос
/ 02 апреля 2011

Да, вам нужна дополнительная переменная, такая как int done_flag;, для использования следующим образом:

pthread_mutex_lock(&mutex);
while (!done_flag) pthread_cond_wait(&cond, &mutex);
/* do something that needs the lock held */
pthread_mutex_unlock(&mutex);
/* do some other stuff that doesn't need the lock held */

Конечно, часто это может быть не флаг, а счет или переменная другого типа, с более сложным условием для проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...