Я пытаюсь осуществить параллельную очередь, и скелет реализации заключается в следующем:разница между pthread_cond_signal до и после pthread_mutex_unlock
struct queue
{
int try_pop()
{
pthread_mutex_lock(&mutex_);
int rt;
while((rt = do_pop()) == -1)
{
pthread_cond_wait(&cond_,&mutex_);
}
pthread_mutex_unlock(&mutex_);
return rt;
}
bool push(int num)
{
pthread_mutex_lock(&mutex_);
push_impl(num);
#if 0
/*signal before unlock*/
pthread_cond_signal(&cond_);
pthread_mutex_unlock(&mutex_);
#else
/*signal after unlock*/
pthread_mutex_unlock(&mutex_);
pthread_cond_signal(&cond_);
#endif
return true;
}
// private function and data member
}
Я могу назвать pthread_cond_signal
до или после разблокирования mutex
.
Мой вопрос в том, какая разница между чистым эффектом двух подходов?
В man-странице есть целый абзац об этом: https://linux.die.net/man/3/pthread_cond_signal – mch
Это может быть актуально: http://stackoverflow.com/questions/4544234/calling- pthread-cond-signal-without-locking-mutex/4544494, но OTOH, вы сохраняете мьютекс при смене общего состояния, так что, возможно, это нормально, чтобы разблокировать мьютекс перед _signal в вашем случае. –