是否有任何理由将C++ 11+ std :: mutex声明为全局变量而不是作为函数参数传递给std :: thread?

whn*_*whn 8 c++ multithreading mutex stdthread stdmutex

我见过大多数使用std::mutex互斥体是全局的例子.我想知道为什么这样做有什么具体的原因?我有自己的程序,我不这样做,只是将互斥量作为一个std::thread std::ref.拥有全局变量不是不好的做法,std::mutexes如果没有语言限制理由这样做,那么C++中全局背后的理性是什么?

Pet*_*ker 7

除非不是全局变量,否则使用全局变量是不好的做法.例如,std::cin是全球性的.

无论您如何使用互斥体,互斥体在某种意义上都是全局的.它们在不同的代码之间共享.因此,您可以将它们设置为全局变量,或者您可以通过不使用它们的函数将它们传递给调用链,直到最终到达某个人.这被称为"流浪汉数据",它也是"不良做法".选择你的毒药.

  • 例如,“ Mutexes在某种意义上是全局的……”您正在寻找的含义可能是“ _extent _”(即变量的生存期),但是当人们说“ global”而没有限定它时,它们通常是指“ global_scope _”(也就是说,代码的哪些部分可以看到它)。C ++`std :: mutex`的范围取决于声明的位置-可以是全局的,可以是局部的,可以是私有成员-就像任何其他类型的变量一样。由于互斥锁的目的是防止线程同时访问相同的数据,因此通常在与它保护的数据相同的范围内声明它是有意义的。 (2认同)