在C++中,线程同步是一个重要的概念,用于确保在多线程环境中访问共享资源时的数据一致性和正确性。以下是一个简单的例子,演示了如何使用std::mutex(互斥量)来同步两个线程对共享资源的访问。
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
// 定义一个全局的互斥量
std::mutex mtx;
// 共享的全局变量
int counter = 0;
// 线程函数,用于增加计数器
void increment() {
for (int i = 0; i < 100000; ++i) {
// 锁定互斥量
std::lock_guard<std::mutex> lock(mtx);
++counter;
}
}
int main() {
// 创建两个线程,它们将增加同一个计数器
std::thread t1(increment);
std::thread t2(increment);
// 等待两个线程完成
t1.join();
t2.join();
// 输出最终结果
std::cout << "Final counter value is " << counter << std::endl;
// 理想情况下,如果同步正确,最终值应该是200000
return 0;
}
在这个例子中,我们定义了一个全局的计数器counter和两个线程t1和t2。这两个线程都运行increment函数,该函数会尝试增加counter的值。由于两个线程同时访问counter,如果没有同步措施,将会导致数据竞争和不一致的结果。
为了解决这个问题,我们使用了std::mutex互斥量mtx来同步对counter的访问。在increment函数中,我们使用std::lock_guard来自动锁定和解锁互斥量。std::lock_guard是一个简单的RAII(Resource Acquisition Is Initialization)风格的互斥量封装,它在构造时锁定互斥量,并在析构时解锁互斥量,从而确保了在函数返回时互斥量总是被正确解锁。
通过这种方式,我们确保了在任何时刻只有一个线程可以修改counter的值,从而避免了数据竞争和不一致的结果。最终,当两个线程都完成时,counter的值应该是200000(假设没有其他错误)。
298

被折叠的 条评论
为什么被折叠?



