解锁无主互斥 windows 调试版本
unlock of unowned mutex windows debug build
我正在尝试将我现有的 Windows 代码移植到适用于 Windows 和 Linux 的通用代码。
将 CRITICAL_SECTION 替换为 std::mutex。代码失败并出现错误:“unlock of unowned mutex”。这仅发生在调试版本中,而不是发布版本中。
这是观察到行为的示例代码:
#include "pch.h"
#include <iostream>
#include <mutex>
static std::mutex g_suCxioAccessLock;
int main()
{
std::unique_lock<std::mutex> locker(g_suCxioAccessLock);
std::cout << "Hello World!\n";
g_suCxioAccessLock.unlock();
}
你能帮我理解为什么它在调试构建中失败吗
g_suCxioAccessLock.unlock();
会解开两次锁,可以去掉。
std::unique_lock
的要点是在构造时锁定互斥量,并在 unique_lock
超出范围时解锁它。您可以使用 unique_lock::unlock()
获取 unique_lock
来提前解锁互斥量,尽管这并不常见;否则你应该让它自己解锁。正如您的代码所示,它使用 g_suCxioAccessLock.unlock()
手动解锁互斥锁,然后 unique_lock
尝试在 main()
returns.
之后再次解锁它
当互斥量超出范围时,锁已经解锁了互斥量。您的代码有效地尝试解锁互斥量两次,但是 std::mutex::unlock
:
Unlocks the mutex.
The mutex must be locked by the current thread of execution, otherwise, the behavior is undefined.
您的代码有未定义的行为。任何事情都可能发生,编译器很乐意让您的代码在调试版本中导致运行时错误。在发布版本中,mutex
可能会被编译器完全删除,因为草率地说,编译器“知道”UB 不属于已编译程序。只解锁互斥体一次。
我正在尝试将我现有的 Windows 代码移植到适用于 Windows 和 Linux 的通用代码。 将 CRITICAL_SECTION 替换为 std::mutex。代码失败并出现错误:“unlock of unowned mutex”。这仅发生在调试版本中,而不是发布版本中。
这是观察到行为的示例代码:
#include "pch.h"
#include <iostream>
#include <mutex>
static std::mutex g_suCxioAccessLock;
int main()
{
std::unique_lock<std::mutex> locker(g_suCxioAccessLock);
std::cout << "Hello World!\n";
g_suCxioAccessLock.unlock();
}
你能帮我理解为什么它在调试构建中失败吗
g_suCxioAccessLock.unlock();
会解开两次锁,可以去掉。
std::unique_lock
的要点是在构造时锁定互斥量,并在 unique_lock
超出范围时解锁它。您可以使用 unique_lock::unlock()
获取 unique_lock
来提前解锁互斥量,尽管这并不常见;否则你应该让它自己解锁。正如您的代码所示,它使用 g_suCxioAccessLock.unlock()
手动解锁互斥锁,然后 unique_lock
尝试在 main()
returns.
当互斥量超出范围时,锁已经解锁了互斥量。您的代码有效地尝试解锁互斥量两次,但是 std::mutex::unlock
:
Unlocks the mutex.
The mutex must be locked by the current thread of execution, otherwise, the behavior is undefined.
您的代码有未定义的行为。任何事情都可能发生,编译器很乐意让您的代码在调试版本中导致运行时错误。在发布版本中,mutex
可能会被编译器完全删除,因为草率地说,编译器“知道”UB 不属于已编译程序。只解锁互斥体一次。