在 C++ 中,当两个或更多的线程需要访问共享数据时,就会出现线程安全问题。这是因为,如果没有适当的同步机制,一个线程可能在另一个线程还没有完成对数据的修改就开始访问数据,这将导致数据的不一致性和程序的不可预测性。为了解决这个问题,C++ 提供了多种线程同步和互斥的机制。
1. 互斥量(Mutex)
互斥量是一种同步机制,用于防止多个线程同时访问共享资源。在 C++ 中,可以使用 std::mutex 类来创建互斥量。
#include <thread>
#include <mutex>
std::mutex mtx; // 全局互斥量
int shared_data = 0; // 共享数据
void thread_func() {
for (int i = 0; i < 10000; ++i) {
mtx.lock(); // 获取互斥量的所有权
++shared_data; // 修改共享数据
mtx.unlock(); // 释放互斥量的所有权
}
}
int main() {
std::thread t1(thread_func);
std::thread t2(thread_func);
t1.join();
t2.join();
std::cout << shared_data << std::endl; // 输出 20000
return 0;
}
在上述代码中,我们创建了一个全局互斥量 mtx 和一个共享数据 shared_data。然后,我们在 thread_func 函数中使用 mtx.lock() 和 mtx.unlock() 来保护对 shared_data 的访问,确保在任何时候只有一个线程可以修改 shared_data。


