iHo*_*ell 0 c++ multithreading mutex locking
我遇到了一些奇怪的行为unique_lock。创建它之后,我尝试调用解锁,但是它使我的程序崩溃。我创建了一个最小示例,该示例在解锁功能上始终崩溃(使用gdb进行确认)。
#include <iostream>
#include <string>
#include <mutex>
#include <thread>
#include <chrono>
std::mutex myMutex;
void lockMe()
{
std::unique_lock lock(myMutex);
std::cout << "Thread\n";
}
int main()
{
std::unique_lock lock(myMutex);
auto c = std::thread(lockMe);
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "Main\n";
myMutex.unlock();
c.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么会这样?
通过创建,std::unique_lock lock(myMutex);您可以将互斥锁/解锁控制授予lock对象。如果在互斥lock对象仍处于对象控制之下时对其进行手动解锁,则会违反该约束,并且lock析构函数将执行两次解锁尝试。
它与所有RAII包装器相似-将资源控制权授予RAII对象后,您不应通过手动处置资源来干扰它。
请注意,std::unique_lock该方法提供了一种在作用域结束之前解锁锁定的互斥锁的方法,该方法不会引起问题:
lock.unlock();
Run Code Online (Sandbox Code Playgroud)