gpt4 book ai didi

c++ - 同一个线程中的 std::unique_lock 和 std::shared_lock - 不应该工作,但是可以吗?

转载 作者:行者123 更新时间:2023-12-05 09:27:15 24 4
gpt4 key购买 nike

为什么可以在 std::shared_mutex 上获得两个不同的锁?

下面的代码

#include <shared_mutex>
#include <iostream>

int main(int /*argc*/, char * /*argv*/[]) {
std::shared_mutex mut;
std::unique_lock<std::shared_mutex> ulock{mut};
if(ulock)
std::cout << "uniqe_lock is bool true\n";
if(ulock.owns_lock())
std::cout << "uniqe_lock owns lock\n";
std::shared_lock<std::shared_mutex> slock{mut};
if(slock)
std::cout << "shared_lock is bool true\n";
if(slock.owns_lock())
std::cout << "shared_lock owns lock\n";
}

当使用 g++ 9.4.0 编译时(当前在 Ubuntu 20.04.1 上可用)

g++ -std=c++17 mutex.cpp

输出所有 cout 行。 IE。线程获取两者 unique_lock shared_lock。据我了解cppreference on the shared_mutex , 获取第二个锁应该失败,而第一个锁仍然存在。

"Within one thread, only one lock (shared or exclusive) can be acquired at the same time."

我在这里错过了什么?为什么在之前的unique_lock仍然有效的情况下,仍然可以获得shared_lock

最佳答案

Also from cppreference : "如果 lock_shared 被一个已经在任何模式下拥有互斥锁的线程调用(独占或共享),行为是未定义的。"

你有UB;诊断此问题不需要工具链,但如果您启用了 stdlib 的 Debug模式(_GLIBCXX_DEBUG for libstdc++),它可能会诊断。

关于c++ - 同一个线程中的 std::unique_lock 和 std::shared_lock - 不应该工作,但是可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72774506/

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