答案:使用std::mutex和std::lock_guard可有效防止多线程下共享数据竞争。通过包含<mutex>头文件并声明std::mutex对象,结合std::lock_guard在构造时加锁、析构时解锁,确保临界区安全;创建多个线程执行递增操作,最终输出正确结果200000,验证了互斥机制的有效性。

在C++多线程编程中,多个线程同时访问共享数据可能导致数据竞争和未定义行为。使用std::mutex可以有效保护共享资源,确保同一时间只有一个线程能访问该资源。
要使用互斥锁,需包含<mutex>头文件,并声明一个std::mutex对象。这个对象通常与某个共享数据配合使用。
#include <iostream> #include <thread> #include <mutex> int shared_data = 0; std::mutex mtx; // 声明互斥锁
当线程需要访问共享数据时,必须先调用lock()获取锁,操作完成后调用unlock()释放锁。但直接调用这两个函数容易出错,比如忘记解锁或异常导致提前退出。
推荐使用std::lock_guard,它采用RAII机制,在构造时自动加锁,析构时自动解锁,更安全。
立即学习“C++免费学习笔记(深入)”;
void increment() {
for (int i = 0; i < 100000; ++i) {
std::lock_guard<std::mutex> guard(mtx); // 自动加锁
++shared_data; // 操作共享数据
} // 离开作用域时自动解锁
}
启动多个线程执行上述函数,若没有互斥锁,最终结果可能小于预期。加上锁后,结果将正确。
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Final value: " << shared_data << std::endl;
return 0;
}
输出应为200000,说明互斥锁成功防止了数据竞争。
基本上就这些。只要涉及共享数据的写入或复杂读写操作,都建议用std::lock_guard<std::mutex>包裹临界区,简单又安全。
以上就是c++++怎么使用互斥锁mutex保护共享数据_c++ mutex互斥锁使用方法的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号