为什么无法通过按值调用传递互斥锁以运行
Why is it impossible to pass mutex to function through Call-by-Value?
完整源代码
如果我在没有引用的情况下将互斥对象传递给worker()
,则会导致编译错误。
void worker(int& p_counter, std::mutex p_mutex) {
...
}
=============================================================================
workers.push_back(std::thread(worker, std::ref(counter), mutex));
但是如果我通过参考,它编译得很好。
void worker(int& p_counter, std::mutex& p_mutex) {
...
}
=============================================================================
workers.push_back(std::thread(worker, std::ref(counter), std::ref(mutex)));
为什么互斥体实现为使用引用传递给函数?
如果我在没有引用的情况下将互斥对象传递给
worker()
,则会导致编译错误
这是因为std::mutex
是一个不可复制的类。
为什么互斥体实现为使用引用传递给函数?
没有理由按值传递std::mutex
的对象(并因此复制它),因为互斥锁应该用于互斥以防止竞争条件(接收它的函数应该能够引用与调用方传递的对象相同的互斥对象)。
因为它没有意义,并且不符合互斥锁的目的。
假设您可以按值发送互斥锁(即互斥体具有复制构造函数)。传递副本并锁定互斥锁...它是被锁定的副本。无法保证您正在阻止竞争条件。因此,复制构造函数不存在,不能按值发送。
相关文章:
- 如何用参数值调用函数(仅在运行时已知)
- 在按值调用 (c++) 中转发构造函数参数
- 在 C++ 中运行时调用模板时,是否可以切换模板的参数类型?
- 在 c++ 托管和异步运行中调用 c# 可执行文件
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- 是否可以在运行时调用用于选择要调用的用户定义文本的逻辑?
- 是否允许编译器在运行时调用立即(consteval)函数
- 按引用调用还是按值调用?
- 显式调用普通默认构造函数会导致额外的赋值调用
- 为什么无法通过按值调用传递互斥锁以运行
- 编译器发射std :: move()运行时调用
- 一个关于在函数中运行未调用语句的非常奇怪的错误
- 为什么在运行时调用虚拟函数时需要虚拟表
- C++函数调用 lambda obj,按值调用比按引用调用快
- 如何在 C++14 中编写用于调用 Fortran 函数的通用包装器(按引用调用 --按值调用>)
- 在原始对象上使用惯用(例如 TBB 的 thread_enumerable_specific')移动赋值调用析构函数
- 使用多个参数值调用模板函数
- 通过Linux命令行执行时,可执行文件运行正常 - 调用C System()命令时运行时错误
- 根据输入参数值调用不同的基类构造函数
- 为什么在C++中使用按值调用