Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将锁定的std::unique_锁移交给新线程_C++_Visual Studio 2015_C++14_Language Lawyer_Mutex - Fatal编程技术网

C++ 将锁定的std::unique_锁移交给新线程

C++ 将锁定的std::unique_锁移交给新线程,c++,visual-studio-2015,c++14,language-lawyer,mutex,C++,Visual Studio 2015,C++14,Language Lawyer,Mutex,考虑以下示例,其中我创建了一个std::mutex,将其锁定,然后将锁移交给另一个线程: #include <future> #include <mutex> int main() { // Create and lock a mutex std::mutex mutex; std::unique_lock<decltype(mutex)> lock(mutex); // Hand off the lock to anoth

考虑以下示例,其中我创建了一个
std::mutex
,将其锁定,然后将锁移交给另一个线程:

#include <future>
#include <mutex>

int main()
{
    // Create and lock a mutex
    std::mutex mutex;
    std::unique_lock<decltype(mutex)> lock(mutex);

    // Hand off the lock to another thread
    auto promise = std::async(std::launch::async, 
        [lock{ std::move(lock) }]() mutable
        {
            // Unlock the mutex
            lock.unlock();
        });

    promise.get();

    return 0;
}
#包括
#包括
int main()
{
//创建并锁定互斥锁
std::互斥互斥;
std::唯一锁(互斥锁);
//把锁转到另一根线上
自动承诺=标准::异步(标准::启动::异步,
[lock{std::move(lock)}]()可变
{
//解锁互斥锁
lock.unlock();
});
答应我;
返回0;
}
该示例似乎在gcc 6.3中运行良好,但在Visual Studio 2015中运行时断言失败,错误为“unowned mutex的解锁”

我注意到,如果我将示例切换为使用,那么示例将成功完成。我还注意到,如果我删除显式的
unlock
,那么示例将成功完成,但互斥锁似乎根本没有解锁(如果我再次尝试锁定互斥锁,VC将崩溃,gcc不会抱怨)

根据我在cppreference.com上读到的内容,在我看来,原始示例应该运行良好。关于
std::mutex
std::unique\u lock
是否禁止线程
解锁
,如果另一个线程执行了
锁定
?这可能是VC的错误吗?

根据:

互斥锁必须由当前执行线程锁定,否则,行为未定义


std::shared\u timed\u mutex::unlock()
的文档具有相同的规范,因此它也不能保证与该类一起工作。

它与
std::unique\u lock
无关,后者只调用互斥锁上的lock/unlock,而互斥锁本身。使用信号量!我会用不同的词,而不是“不保证有效”@FrançoisAndrieux,很可能你有XYproblem@Slava我通过将对互斥体的引用传递给
async
函数并从中获取另一个锁来解决这个问题。如果有人窃取了中间的互斥锁,这也没关系,只是解锁一个你知道你马上就需要的互斥锁感觉像是浪费。我只是好奇为什么最初的方法不起作用。@FrançoisAndrieux它不起作用,因为很可能您的锁定逻辑有缺陷,hense XY问题。但你没有提供足够的细节来说明更多。