首页 > 解决方案 > 为什么不能通过 Call-by-Value 传递 mutex 来发挥作用?

问题描述

完整的源代码

如果我将互斥对象传递给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)));

为什么互斥锁被实现为使用引用传递给函数?

标签: c++thread-safety

解决方案


如果我将互斥对象传递给worker()没有引用,则会导致编译错误

那是因为std::mutex是一个不可复制的类。

为什么互斥锁被实现为使用引用传递给函数?

没有理由std::mutex按值传递对象(因此复制它),因为互斥体应该用于互斥以防止竞争条件(接收它的函数应该能够引用与传递的对象相同的互斥体对象由来电者)。


推荐阅读