pthread_mutex_unlock之前和之后的pthread_cond_signal之间的差异

时间:2017-02-20 08:51:55

标签: c++ pthreads

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

如果在try_pop()上有不同优先级的线程竞争,那么解锁后的信令会留下一个窗口,其中高优先级线程在pthread_cond_wait()中被阻止,但是低优先级线程进入{{1}在解锁和信号之间,允许它在高优先级线程前跳转。解锁前的信号将阻止这种情况。

如果您有不同的线程优先级竞争,那么解锁后的信号将允许发出信号的线程唤醒并立即获取互斥锁,而不是必须从& #34;等待条件变量"中间人等待互联网"首先是国家。

但实际上,其中很少。它不可能产生任何可衡量的差异。