在多个线程可能需要访问 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 是否忽略了此构造的可能用法,特别是静态的互斥锁和锁?或者整段代码是一个坏主意并且存在更好的替代方案?这个警告让我想知道......
锁在其生命周期结束时被释放。对于静态变量,它位于程序的末尾。你不想要这样。消除静电:
static std::mutex m;
std::unique_lock<std::mutex> lock(m, std::defer_lock);