有什么理由C++ 11+ std::mutex 应该声明为全局变量,而不是作为函数参数传递到 std::thread 中
Is there any reason C++ 11+ std::mutex should be declared as a global variable instead of passed into a std::thread as a function parameter?
我已经看到大多数使用互斥锁是全局的std::mutex
的例子。 我想知道这样做有什么具体原因吗? 我有自己的程序,我不这样做,只是将互斥锁作为std::thread
std::ref
传递。 拥有全局变量不是不好的做法吗,如果没有语言限制这样做的理由,那么C++中全球std::mutexes
背后的理性是什么?
除非不是全局变量,否则使用全局变量是一种不好的做法。例如,std::cin
是全局的。
从某种意义上说,互斥体是全球性的,无论您如何使其可用。它们在不同的代码段之间共享。因此,你可以将它们设为全局变量,或者你可以通过不使用它们的函数将它们传递到调用链中,直到你最终到达使用它们的人。这被称为"流浪数据",也是"不良做法"。选择你的毒药。
这样做很可能是为了使示例更易于理解,允许使用互斥锁本身作为示例的重点,而不是确切的细节。
通常,互斥锁保护资源,在许多情况下,互斥锁与资源共存是有意义的。例如,如果某个类具有需要受互斥锁保护的成员容器,则使互斥锁也成为该类的成员。然后,当类实例由多个线程操作时,可以使用成员互斥锁来保护对内部容器的所需访问。
相关文章:
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- std::函数常量正确性未遵循
- 具有变量Number of Arguments的std::函数的矢量
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 如何将类 1 的 std::函数绑定到类 2 的函数?
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 如何将 STL 队列推送函数绑定到 std::函数?
- std::函数不起作用,但普通的旧函数指针可以 - 为什么?
- 获取 std::函数以推断按引用传递/按值传递
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 从其存储的回调中删除 std::函数是否安全
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 创建一个带有 lambda 的 std::函数,而不知道函数的参数
- std::函数的解释
- 在调用过程中删除 std::函数