首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >互斥锁优先级

互斥锁优先级
EN

Stack Overflow用户
提问于 2012-12-22 06:09:11
回答 5查看 2.6K关注 0票数 5

在多线程(双线程)程序中,我有这样的代码:

代码语言:javascript
运行
复制
while(-1)
{
    m.lock();

    (...)

    m.unlock();
}

m是一个互斥锁(在我的例子中是一个c++11 std::mutex,但我认为如果我使用不同的库,它不会改变)。

假设第一个线程拥有互斥锁,并且它在(...) part中做了一些事情。第二个线程试图获取互斥锁,但它在等待第一线程释放m

问题是:当线程1结束它的(...)执行并解锁互斥锁时,我们能确保线程2获取互斥锁吗?或者线程1可以在线程2之前重新获取互斥锁,将其保留在lock()

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-12-22 06:16:16

如果两个线程的优先级相等,那么标准互斥锁实现就没有这样的保证。有些操作系统会列出“谁在等待”,并会在您发布时选择“等待时间最长”,但这只是一个实现细节,而不是您可以可靠依赖的东西。

假设您有两个线程,每个线程都运行如下内容:

代码语言:javascript
运行
复制
m.lock();

(...)

m.unlock();
(...)    // Clearly not the same code as above (...)
m.lock();

(...)    // Some other code that needs locking against updates. 

m.unlock();

你想让上面的代码每次都在第二个锁上切换线程吗?

票数 3
EN

Stack Overflow用户

发布于 2012-12-22 06:22:31

C++标准并不保证已授予互斥锁的顺序。因此,完全有可能的是,活动线程保持对std::mutex munlock()lock(),而不是另一个线程试图获取锁。我不认为C++标准提供了一种控制线程优先级的方法。我不知道你想做什么,但可能有另一种方法可以避免你遇到的问题。

票数 4
EN

Stack Overflow用户

发布于 2012-12-22 06:25:23

没有保证,因为线程之间没有以任何方式相互排序。事实上,唯一的同步点是互斥锁。

例如,如果第一线程正在一个紧凑的循环中运行函数,那么它完全有可能立即重新获得锁。典型的实现有一个通知和唤醒机制,如果任何线程在互斥锁上休眠,但也可能存在让正在运行的线程继续运行而不是执行上下文切换的偏见……这在很大程度上取决于当时平台的实现和细节。

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

https://stackoverflow.com/questions/13997825

复制
相关文章

相似问题

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