pthread_cond_signal在pthread_mutex_unlock之前和之后之间的区别

Difference between pthread_cond_signal before and after pthread_mutex_unlock

本文关键字:pthread 之后 区别 之间 unlock cond signal mutex      更新时间:2023-10-16

我正在尝试实现并发队列,实现的骨架如下:

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
}

我可以在解锁mutex之前或之后致电pthread_cond_signal

我的问题是两种方法的净效应之间有什么区别?

看来,在执行_signal之前,您似乎可以释放Mutex。在某些系统上,这甚至可以减少不必要的上下文切换。

请参阅http://www.domaigne.com/blog/computing/condvars-signal-with-mutex-locked-or-not/

如果您在try_pop()上有不同优先级的线程,则在解锁后发出信号会留下一个窗口,其中高优先级线程在pthread_cond_wait()中被阻止,但是低优先级线程将在try_pop()中介于两者之间。解锁和信号,使其可以跳到高优先级线的前面。解锁前发出信号将阻止这种情况。

如果您 具有不同的线程优先级,那么解锁后的信号将允许信号的线醒来并立即拿起Mutex,而不必从等待"条件变量"到中间"等待Mutex"状态。

确实,其中几乎没有。不太可能有任何可测量的差异。