【发布时间】:2013-05-29 03:37:09
【问题描述】:
我使用生产者-消费者模型用 pthread 编写了一个多线程程序。
当我使用英特尔 VTune 分析器分析我的程序时,我发现生产者和消费者在 pthread_mutex_unlock 上花费了大量时间。我不明白为什么会这样。我认为线程可能要等待很长时间才能获得互斥锁,但释放互斥锁应该很快,对吧?
下面的快照来自英特尔 VTune。它显示了消费者尝试从缓冲区中获取项目的代码,以及每个代码行所消耗的时间。
我的问题是为什么 pthread_mutex_unlock 有这样的开销?是 pthread mutex 本身的问题还是我使用它的方式有问题?
【问题讨论】:
-
如果互斥锁上存在大量争用,解锁该互斥锁可能会很慢,因为解锁的部分工作是唤醒等待互斥锁的所有线程。
-
我认为如果将
pthread_mutex_unlock()调用移到pthread_cond_signal()调用上方,看看结果会很有趣。在向条件变量发出信号时不需要保持互斥锁(仅在等待它时),我怀疑发生的情况是信号导致互斥锁争用,因为立即释放的线程尝试获取互斥锁,而信号线程仍然存在。 -
@MichaelBurr 好点!我根据您的建议进行了测试,该程序现在快了大约 40%。
-
@stone199141:感谢您让我们知道结果。如果不是太麻烦,我有兴趣在将更改添加到问题后获得来自 vtune 的等效屏幕截图(或者我想它应该在答案中)。
-
@MichaelBurr:在他的代码中进行这样的更改并不安全!如果他在持有互斥锁的同时发出信号,则保证该信号会唤醒一个选择阻塞在完整状态的线程。如果他在释放互斥锁后发出信号,则另一个线程可能会阻塞处于空状态的条件变量,并且他可能会在发出信号时唤醒该线程。该线程将重新进入睡眠状态,信号将丢失。如果您使用相同的条件变量来发出多个状态的信号,则在发出信号之前您无法安全地解锁互斥锁。 (你可以在广播之前。)
标签: multithreading pthreads mutex intel-vtune