c++ - std::mutex 对象的范围是什么?
问题描述
这是示例代码:
#include <iostream>
#include <thread>
#include <mutex>
int value = 0;
void criticalSection(int changeValue)
{
std::mutex mtx;
std::unique_lock<std::mutex> uniqueLock(mtx);
value = changeValue;
std::cout << value << std::endl;
uniqueLock.unlock();
uniqueLock.lock();
++value;
std::cout << value << std::endl;
}
int main(int argc, char **argv)
{
std::thread t1(criticalSection, 1), t2(criticalSection, 2);
t1.join();
t2.join();
return 0;
}
我的问题是:上面代码中 mtx 的范围是什么?每个线程会在该线程中创建一个 mtx 吗?如果我将 mtx 指定为全局变量而不是局部变量,有什么区别吗?
我刚开始学习 C++ 中的多线程。非常感谢您的帮助。
解决方案
互斥体没有特殊的范围规则。他们的范围在 next 结束}
。在您的代码中,每次调用criticalSection
都会创建一个新mutex
实例。因此,互斥锁不可能用于同步两个线程。为此,两个线程都需要使用相同的互斥锁。
您可以将对互斥体的引用传递给函数:
#include <iostream>
#include <thread>
#include <mutex>
int value = 0;
void criticalSection(int changeValue,std::mutex& mtx)
{
std::unique_lock<std::mutex> uniqueLock(mtx);
//...
}
int main(int argc, char **argv)
{
std::mutex mtx;
std::thread t1(criticalSection, 1,std::ref(mtx)), t2(criticalSection, 2,std::ref(mtx));
t1.join();
t2.join();
return 0;
}
或者,您可以使用 a并在唯一共享状态std::atomic<int> value;
时删除互斥锁。value
推荐阅读
- logstash - Logstash 过滤器使用 HTTP 过滤器插件发送整个事件
- user-interface - 图形用户界面还是命令行界面?我在云端安装了 Modelica
- reactjs - 我在哪里可以放置这些反应钩子?
- azure - 使用 docker 容器版本时如何使用 Azure 表单识别器调用分析收据?
- ios - 将 GestureRecognizer 添加到字符串无法正常工作
- html - 以角度改变动态创建元素的可见性
- json - Python3.8 对象列表转json
- sql - WHERE、AND、OR 组合
- java - 为什么没有'else',它会在BTree的preoder遍历中抛出java.lang.NullPointerException?
- python - 在 Python 中使用文件 POST 请求