在多线程(双线程)程序中,我有这样的代码:
while(-1)
{
m.lock();
(...)
m.unlock();
}m是一个互斥锁(在我的例子中是一个c++11 std::mutex,但我认为如果我使用不同的库,它不会改变)。
假设第一个线程拥有互斥锁,并且它在(...) part中做了一些事情。第二个线程试图获取互斥锁,但它在等待第一线程释放m。
问题是:当线程1结束它的(...)执行并解锁互斥锁时,我们能确保线程2获取互斥锁吗?或者线程1可以在线程2之前重新获取互斥锁,将其保留在lock()中
发布于 2012-12-22 06:16:16
如果两个线程的优先级相等,那么标准互斥锁实现就没有这样的保证。有些操作系统会列出“谁在等待”,并会在您发布时选择“等待时间最长”,但这只是一个实现细节,而不是您可以可靠依赖的东西。
假设您有两个线程,每个线程都运行如下内容:
m.lock();
(...)
m.unlock();
(...) // Clearly not the same code as above (...)
m.lock();
(...) // Some other code that needs locking against updates.
m.unlock();你想让上面的代码每次都在第二个锁上切换线程吗?
发布于 2012-12-22 06:22:31
C++标准并不保证已授予互斥锁的顺序。因此,完全有可能的是,活动线程保持对std::mutex m的unlock()和lock(),而不是另一个线程试图获取锁。我不认为C++标准提供了一种控制线程优先级的方法。我不知道你想做什么,但可能有另一种方法可以避免你遇到的问题。
发布于 2012-12-22 06:25:23
没有保证,因为线程之间没有以任何方式相互排序。事实上,唯一的同步点是互斥锁。
例如,如果第一线程正在一个紧凑的循环中运行函数,那么它完全有可能立即重新获得锁。典型的实现有一个通知和唤醒机制,如果任何线程在互斥锁上休眠,但也可能存在让正在运行的线程继续运行而不是执行上下文切换的偏见……这在很大程度上取决于当时平台的实现和细节。
https://stackoverflow.com/questions/13997825
复制相似问题