c++ - 为什么不能通过 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)));
为什么互斥锁被实现为使用引用传递给函数?
解决方案
如果我将互斥对象传递给
worker()
没有引用,则会导致编译错误
那是因为std::mutex
是一个不可复制的类。
为什么互斥锁被实现为使用引用传递给函数?
没有理由std::mutex
按值传递对象(因此复制它),因为互斥体应该用于互斥以防止竞争条件(接收它的函数应该能够引用与传递的对象相同的互斥体对象由来电者)。
推荐阅读
- node.js - 在discord.js中回复消息后如何获取消息对象
- docker - 无法将映像推送到 GCP 容器注册表
- typescript - 离子分享功能无法在安卓设备中使用
- embedded - 有什么方法可以在 STM32 CubeIDE 中以微秒为单位进行延迟?
- swift - 延迟 SwiftUI 组合转换
- c# - 如何在 Swagger 中使用用户名和密码为 .NET Web API 生成承载令牌
- python - 从另一个导入的笔记本调用函数时出现“列不可迭代”错误
- git - 将 git blame 导出为 PDF 或 HTML
- java - 数据未保存在嵌套服务调用中
- rust - 您如何实现 H256 的特征 TypeInfo?