pthread_cond_signal在pthread_mutex_unlock之前和之后之间的区别
Difference between pthread_cond_signal before and after 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
}
我可以在解锁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"状态。
确实,其中几乎没有。不太可能有任何可测量的差异。
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 在类定义之后定义一个私有方法
- 在循环C++中指定字符串之后,不会打印该字符串
- C++宏忽略之后的内容
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- strncpy之后的char数组的错误行为
- 计算十进制 c++ 之后的数字
- "x += x--"之后的 x 是什么?
- 类的前向声明之后的类成员函数定义,在类声明之前
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- execlp() 在 fork() 之后无法正常工作
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 如何在MISRA C++之后实施CRTP
- 在 c++11 中为 pthread 设置调度参数
- 在 OpenCV 的 namedWindow 之前或之后初始化 Tesseract
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- C++ 如果在 if 为 true 之后运行,为什么还会这样做
- 在 fork() 之后,我在我的程序中不断得到相同的 pid
- OpenSSL C API:如何在程序exec()之后恢复TLS连接?
- pthread中的线程在一些迭代之后停止工作