首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pthread Mutex: pthread_mutex_unlock()耗费大量时间

Pthread Mutex: pthread_mutex_unlock()耗费大量时间
EN

Stack Overflow用户
提问于 2013-06-03 09:50:38
回答 1查看 4K关注 0票数 15

我用pthread编写了一个多线程程序,使用生产者-消费者模型。

当我使用英特尔VTune profiler分析我的程序时,我发现生产者和消费者在pthread_mutex_unlock上花费了大量时间。我不明白为什么会发生这种事。我认为线程可能会等待很长时间才能获得互斥锁,但释放互斥锁应该很快,对吧?

下面的快照来自英特尔VTune。它显示了消费者尝试从缓冲区获取项目的代码,以及每个代码行所消耗的时间。

我的问题是,为什么pthread_mutex_unlock有这么大的开销?问题出在pthread互斥锁本身还是我使用它的方式上?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-15 23:08:22

pthread_mutex_unlock()函数将释放互斥对象所引用的互斥对象。但是,释放互斥锁的方式取决于互斥锁的类型属性。如果在调用pthread_mutex_unlock()时,互斥量引用的互斥量对象上有线程被阻塞,导致互斥量变得可用,则调度策略应确定哪个线程将获得该互斥量。

如果互斥类型为PTHREAD_MUTEX_NORMAL,则不提供死锁检测。尝试重新锁定互斥锁会导致死锁。如果线程试图解锁尚未锁定的互斥锁或未锁定的互斥锁,则会导致未定义的行为。

如果互斥类型为PTHREAD_MUTEX_ERRORCHECK,则应提供错误检查。如果线程试图重新锁定已经锁定的互斥锁,则会返回一个错误。如果线程试图解锁未锁定的互斥锁或解锁的互斥锁,则会返回错误。

如果互斥锁类型是PTHREAD_MUTEX_RECURSIVE,那么互斥锁将保持锁计数的概念。当线程第一次成功获取互斥锁时,锁计数应设置为1。每次线程重新锁定该互斥锁时,锁计数都会递增1。每次线程解锁互斥锁时,锁计数都会递减1。当锁计数达到零时,互斥锁将变得可供其他线程获取。如果线程试图解锁未锁定的互斥锁或解锁的互斥锁,则会返回错误。

如果互斥锁类型为PTHREAD_MUTEX_DEFAULT,则尝试递归锁定互斥锁将导致未定义的行为。如果互斥锁未被调用线程锁定,则尝试解锁该互斥锁会导致未定义的行为。如果互斥锁未锁定,则尝试解锁互斥锁会导致未定义的行为。

我通常更喜欢使用PTHREAD_MUTEX_RECURSIVE互斥锁,因为在这种情况下,当计数达到零时互斥锁将变为可用,并且调用线程不再对该互斥锁拥有任何锁。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16889063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档