std::unique_lock::release 的用例是什么?

what are the use cases for std::unique_lock::release?

在什么情况下会使用std::unique_lockrelease方法? 我错误地使用了 release 方法而不是 unlock 方法,我花了一段时间才明白为什么下面的代码不起作用。

#include <mutex>
#include <iostream>
#include <vector>
#include <thread>
#include <chrono>

std::mutex mtx;

void foo()
{    
    std::unique_lock<std::mutex> lock(mtx);
    std::cout << "in critical section\n";
    std::this_thread::sleep_for(std::chrono::seconds(1));
    lock.release();
}

int main()
{
    std::vector<std::thread> threads;
    for (int i = 0; i < 5; ++i)
        threads.push_back(std::thread(foo));

    for (std::thread& t : threads)
        t.join();
}

.release() 当您想保持互斥量锁定直到其他 object/code 决定解锁它时很有用...例如,如果您正在调用需要锁定互斥量的函数并会在该函数处理的某个点自行解锁,其中该函数只接受 std::mutex& 而不是 std::unique_lock<std::mutex>&&。 (概念上类似于智能指针释放函数的使用。)

它在 this answer 中有很好的用途,其中锁定状态的所有权明确地从函数本地 unique_lock 转移到外部实体(通过引用 可锁定 参数).

这个具体示例是典型的用法:将锁定状态的所有权从一个对象(甚至类型)转移到另一个对象。