C++ 多线程中如何共享变量
时间: 2024-04-18 14:03:55 浏览: 163
共享内存多线程数据交换(C++)
4星 · 用户满意度95%
在C++多线程编程中,如果需要多个线程共享变量,需要使用一些同步机制来保证数据的正确性。常用的同步机制包括互斥锁(mutex)、条件变量(condition variable)、信号量(semaphore)等等。
其中,互斥锁是最常用的同步机制之一。互斥锁可以保证同一时间只有一个线程可以访问被保护的变量,从而避免了竞争条件(race condition)的发生。当一个线程需要访问共享变量时,它必须先获得互斥锁,然后才能对变量进行操作。当这个线程完成操作后,必须释放互斥锁,以便其他线程可以访问变量。
下面是一个使用互斥锁共享变量的示例代码:
```
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // 全局互斥锁
int shared_var = 0; // 共享变量
void increment() {
for (int i = 0; i < 1000000; i++) {
std::lock_guard<std::mutex> lock(mtx); // 获得互斥锁
shared_var++; // 对共享变量进行操作
}
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "shared_var = " << shared_var << std::endl;
return 0;
}
```
在上面的例子中,我们定义了一个全局互斥锁 `mtx` 和一个共享变量 `shared_var`。在 `increment` 函数中,我们使用 `std::lock_guard` 类来获得互斥锁,并对共享变量进行操作。在 `main` 函数中,我们创建两个线程来执行 `increment` 函数,并等待它们执行完毕。最后,我们输出共享变量的值。
需要注意的是,在多线程编程中,共享变量的操作可能会涉及到原子性问题,即一个操作可能被分为多个步骤,而这些步骤可能被其他线程中断。因此,在对共享变量进行读写操作时,需要保证这些操作是原子的,可以使用 C++11 中提供的原子操作来实现。
阅读全文