主线程定义一个全局变量,子线程修改
时间: 2023-08-11 19:39:15 浏览: 288
这种情况下需要使用线程同步机制来保证数据的正确性。可以使用互斥锁来保护全局变量,保证同一时刻只有一个线程访问该变量。具体做法是,在主线程中定义一个互斥锁对象,然后在每个子线程中对该锁对象进行加锁和解锁操作,在加锁期间其他线程无法访问该变量,从而避免了数据竞争的问题。以下是示例代码:
```c++
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // 定义互斥锁对象
int global_var = 0;
void ThreadFunc() {
// 对全局变量进行访问前加锁
mtx.lock();
global_var++;
std::cout << "In thread: global_var = " << global_var << std::endl;
// 访问结束后解锁
mtx.unlock();
}
int main() {
std::thread t1(ThreadFunc);
std::thread t2(ThreadFunc);
t1.join();
t2.join();
std::cout << "In main: global_var = " << global_var << std::endl;
return 0;
}
```
在上述代码中,两个子线程分别对全局变量进行加1操作,由于加锁和解锁之间的代码块是原子操作,因此可以保证同一时刻只有一个线程访问全局变量,避免了数据竞争的问题。最终结果应该是:
```
In thread: global_var = 1
In thread: global_var = 2
In main: global_var = 2
```
阅读全文