互斥/锁构造引发 MSVC 警告

问题描述 投票:0回答:1

在多个线程可能需要访问 std::cout 的库中,我编写了以下函数,以便控制对 std::cout 的访问(通过一个非常简单的示例如何使用它......):

// Mutexed access to std::out.
inline void HelperFunctions::controlStdCoutAccess(const StdCoutAccess mode)
{
    static std::mutex m;
    static std::unique_lock<std::mutex> lock(m, std::defer_lock);

    // Check if we lock or unlock.
    if (mode == StdCoutAccess::Lock)
        lock.lock();
    else
        lock.unlock();
}

// Print to std::cout, but mutexed for thread safety.
inline void HelperFunctions::mutexedPrint(const std::string& string)
{
    controlStdCoutAccess(StdCoutAccess::Lock);
    std::cout << string;
    controlStdCoutAccess(StdCoutAccess::Unlock);
}

在 MSVC 中,我收到警告:“无法释放锁定”、“无法保持锁定”、“释放未持有的锁定”。 gcc 中没有警告。

MVSC 是否忽略了此构造的可能用法,特别是静态的互斥锁和锁?或者整段代码是一个坏主意并且存在更好的替代方案?这个警告让我想知道......

c++ visual-c++ mutex
1个回答
0
投票

锁在其生命周期结束时被释放。对于静态变量,它位于程序的末尾。你不想要这样。消除静电:

static std::mutex m;
std::unique_lock<std::mutex> lock(m, std::defer_lock);
© www.soinside.com 2019 - 2024. All rights reserved.