STD :: Mutex如何在不同的线程中解锁
How std::mutex got unlocked in different thread?
i正在阅读二进制信号量和静音之间的差异(二进制信号量和mutex之间的差异(,我想验证的一件事是,当任务锁定(获取(互斥s时,只有它才能可以解锁(释放(。如果另一个任务试图解锁互斥X,则尚未锁定(因此没有(,则遇到错误条件,最重要的是,Mutex未解锁,并且我在C 14中的代码下方创建了这一点:
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
using namespace std;
int counter;
int i;
std::mutex g_pages_mutex;
void increment()
{
std::cout<<"increment...."<<std::endl;
g_pages_mutex.lock();
bool flag = g_pages_mutex.try_lock();
std::cout<<"increment Return value is "<<flag<<std::endl;
counter++;
std::this_thread::sleep_for(5s);
}
void increment1()
{
std::this_thread::sleep_for(5s);
std::cout<<"increment1...."<<std::endl;
g_pages_mutex.unlock();
counter++;
bool flag = g_pages_mutex.try_lock();
std::cout<<"increment1 Return value is "<<flag<<std::endl;
}
int main()
{
counter = 0;
std::thread t(increment);
std::thread t1(increment1);
t.join();
t1.join();
return 0;
}
但是,在此示例中,我能够从不拥有它的线程中解锁Mutex,因此只需要有一些理解的差距,或者在C 14 std :: mutex?
在 std::mutex
上调用 try_lock
(不是递归的(,呼叫线程,在不呼叫线程拥有的静音上调用 unlock
导致不确定的行为。
它似乎成功,可能会失败并抛出异常,它可能会格式化您的硬盘驱动器,可能会召唤鼻恶魔,可能会时间旅行并为您纠正您的代码,或者可能会做其他事情。就标准而言,是允许的。
呼叫 unlock
的先决条件是持有静音的所有权,根据(std(30.4.1.2:
表达式M.unlock((应具有良好的形式,并具有以下语义:
要求:呼叫线应拥有静音。
由于执行 increment1
的线程不持有静音的所有权,因此引爆了未定义的行为。
来自cppReference std::mutex
(强调矿山(:
如果在仍然由任何线程所有的同时销毁二线,或线程在拥有互斥品时终止。
从std::mutex::try_lock
上的同一站点,正如TC在答案中指出的:
如果try_lock是由已经拥有静音的线程调用的,则行为是未定义的。
以及std::mutex::unlock
,正如TC在其答案中指出的那样:
静音必须被当前的执行线锁定,否则,行为是未定义的。
您的功能和线程都会导致不确定的行为:
-
increment
调用lock()
,然后try_lock()
:未定义的行为 -
increment1
在拥有互不个性之前调用unlock()
:不确定的行为
,如果您在线程结束之前不致电unlock()
,则从increment
中删除try_lock()
仍会导致不确定的行为。
您应该更喜欢使用std::lock_guard
,或者对于简单的int
,也可以使用std::atomic
- c++ 为什么我不应该从不同的线程解锁互斥锁
- C++线程互斥锁
- 标准 cpp 数据结构和线程互斥锁?
- 如何修复macOS线程互斥锁性能缓慢的问题?
- 带有多个线程的锁在C 中并行编程
- C++多线程互斥锁"reset"
- ACE互斥锁是如何工作的,以及为什么ACE线程互斥锁的工作方式不同
- C++11 多个读取和一个写入线程互斥锁
- 如何在 Linux 中分析线程互斥锁
- p线程互斥锁,无全局互斥锁
- 提升线程死锁,任何人都可以检查原因
- 如何在C++Qt程序中调试多线程死锁
- C++11中的线程:接近锁保护的更好方法
- 如何修复C++线程死锁示例
- Qt信号槽多线程死锁
- c++多线程互斥锁问题
- Boost进程间互斥锁vs Boost线程互斥锁
- 独立的物理线程没有锁
- 等待条件下的C++线程死锁
- 多线程无锁应用程序中具有多个迭代器的一个向量