为什么无法通过按值调用传递互斥锁以运行

Why is it impossible to pass mutex to function through Call-by-Value?

本文关键字:运行 值调用 为什么      更新时间:2023-10-16

完整源代码

如果我在没有引用的情况下将互斥对象传递给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的对象(并因此复制它),因为互斥锁应该用于互斥以防止竞争条件(接收它的函数应该能够引用与调用方传递的对象相同的互斥对象)。

因为它没有意义,并且不符合互斥锁的目的。

假设您可以按值发送互斥锁(即互斥体具有复制构造函数)。传递副本并锁定互斥锁...它是被锁定的副本。无法保证您正在阻止竞争条件。因此,复制构造函数不存在,不能按值发送。