mutex是C++中用于保护共享数据的同步机制,通过std::mutex实现线程互斥访问,配合std::lock_guard可自动加解锁,避免死锁,确保多线程环境下共享变量操作的安全性与正确性。

在C++多线程编程中,多个线程同时访问共享数据可能导致数据竞争,从而引发未定义行为。使用 std::mutex 可以有效保护共享资源,确保同一时间只有一个线程能访问该资源。
std::mutex 是 C++11 引入的同步机制,用于控制多个线程对共享数据的访问。当一个线程锁定(lock)了互斥量后,其他试图锁定该互斥量的线程将被阻塞,直到持有锁的线程解锁(unlock)。
下面是一个使用 std::mutex 保护全局计数器的示例:
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
int shared_counter = 0;
std::mutex mtx; // 定义互斥锁
void increment_counter(int iterations) {
for (int i = 0; i < iterations; ++i) {
mtx.lock(); // 加锁
++shared_counter; // 访问共享数据
mtx.unlock(); // 解锁
}
}
int main() {
std::vector<std::thread> threads;
const int num_threads = 5;
const int inc_per_thread = 1000;
for (int i = 0; i < num_threads; ++i) {
threads.emplace_back(increment_counter, inc_per_thread);
}
for (auto& t : threads) {
t.join();
}
std::cout << "Final counter value: " << shared_counter << std::endl;
return 0;
}
这个程序创建了5个线程,每个线程对 shared_counter 增加1000次。由于使用了 mtx.lock() 和 mtx.unlock(),保证了每次自增操作的原子性,最终结果应为5000。
立即学习“C++免费学习笔记(深入)”;
直接调用 lock() 和 unlock() 容易出错,比如在 unlock 前发生异常,会导致锁无法释放。更安全的做法是使用 std::lock_guard,它采用 RAII(资源获取即初始化)机制,在作用域内自动加锁,离开时自动解锁。
void safe_increment(int iterations) {
for (int i = 0; i < iterations; ++i) {
std::lock_guard<std::mutex> guard(mtx); // 自动加锁
++shared_counter; // 操作共享数据
} // guard 离开作用域,自动解锁
}
即使在临界区发生异常,lock_guard 也会确保解锁,避免死锁或资源泄漏。
在实际开发中,应注意以下几点:
基本上就这些。正确使用 mutex 能有效解决多线程下的数据竞争问题,结合 lock_guard 可写出更安全、简洁的同步代码。
以上就是c++++如何使用mutex来保护共享数据_c++多线程数据同步与互斥锁使用示例的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号