gpt4 book ai didi

c++ - 将 unique_lock 移动到另一个线程

转载 作者:太空狗 更新时间:2023-10-29 20:54:39 26 4
gpt4 key购买 nike

我想知道当您移动包含 recursive_mutexunique_lock 时会发生什么。

具体来说,我正在查看这段代码:

recursive_mutex g_mutex;

#define TRACE(msg) trace(__FUNCTION__, msg)

void trace(const char* function, const char* message)
{
cout << std::this_thread::get_id() << "\t" << function << "\t" << message << endl;
}

future<void> foo()
{
unique_lock<recursive_mutex> lock(g_mutex);
TRACE("Owns lock");
auto f = std::async(launch::async, [lock = move(lock)]{
TRACE("Entry");
TRACE(lock.owns_lock()? "Owns lock!" : "Doesn't own lock!"); // Prints Owns lock!
this_thread::sleep_for(chrono::seconds(3));
});
TRACE(lock.owns_lock()? "Owns lock!" : "Doesn't own lock!"); // Prints Doesn't own lock!
return f;
}


int main()
{
unique_lock<recursive_mutex> lock(g_mutex);
TRACE("Owns lock");
auto f = foo();
TRACE(lock.owns_lock()? "Owns lock!" : "Doesn't own lock!"); // Prints Owns lock!
f.wait();
TRACE(lock.owns_lock()? "Owns lock!" : "Doesn't own lock!"); // Prints Owns lock!
}

这段示例代码的输出让我大吃一惊。 main() 中的 unique_lock 如何知道线程释放了互斥量?是真的吗?

最佳答案

您似乎将一些魔法属性归于 unique_lock。它没有任何内容,这是一个非常简单的类。它有两个数据成员,Mutex* pmbool owns(显示的成员名称仅供说明)。 lock() 就是pm->lock(); owns = true;,并且 unlock 执行 pm->unlock();拥有 = 假;。析构函数是 if (owns) unlock();。 Move constructor 复制了这两个成员,并将它们在原始中相应地设置为 nullptrfalseowns_lock() 返回 owns 成员的值。

所有线程同步的魔法都在互斥量本身及其lock()unlock() 方法中。 unique_lock 只是它的薄包装。

现在,作为先决条件,调用 mutex.unlock() 的线程必须持有互斥锁(也就是说,该线程之前已在其上调用了 lock() ), 否则程序表现出未定义的行为。无论您是显式调用 unlock,还是欺骗像 unique_lock 这样的助手来为您调用它,都是如此。

鉴于所有这些,将 unique_lock 实例移动到另一个线程只是此后不久触发未定义行为的一种方法;没有好处。

关于c++ - 将 unique_lock<recursive_mutex> 移动到另一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38438362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com