在多线程编程中,我们经常会遇到需要多个线程按照一定的顺序执行的情况。例如,两个线程交替打印,这就是一个典型的同步问题。在C++中,我们可以使用条件变量(condition_variable)和互斥锁(mutex)来实现这种同步。
我们需要了解什么是条件变量和互斥锁。互斥锁是一种同步机制,用于防止两个线程同时访问相同的资源。条件变量则是一种可以让线程等待某个特定条件的同步机制。当条件不满足时,线程会等待;当条件满足时,线程会被唤醒并继续执行。
下面我们将通过一个简单的例子来说明如何在C++中实现两个线程交替打印。
我们需要包含相关的头文件,并定义两个全局的条件变量和互斥锁。
```cpp
#include
#include
#include
std::condition_variable cv1, cv2;
std::mutex mtx;
bool flag = true;
```
然后我们创建两个线程,每个线程都有一个循环,循环中首先获取互斥锁,然后根据条件变量的状态决定是否打印。
```cpp
void print1() {
for (int i = 0; i < 10; ++i) {
std::unique_lock lock(mtx);
cv1.wait(lock, []{return flag;});
std::cout << "Thread 1: " << i << std::endl;
flag = false;
cv2.notify_one();
}
}
void print2() {
for (int i = 0; i < 10; ++i) {
std::unique_lock lock(mtx);
cv2.wait(lock, []{return !flag;});
std::cout << "Thread 2: " << i << std::endl;
flag = true;
cv1.notify_one();
}
}
```
我们在主函数中创建这两个线程,并等待他们完成。
```cpp
int main() {
std::thread t1(print1);
std::thread t2(print2);
t1.join();
t2.join();
return 0;
}
```
在这个例子中,线程1和线程2交替打印。每次打印后,它们都会通知另一个线程,然后等待下一次的机会。这就是条件变量和互斥锁的作用。
C++提供了丰富的同步机制,可以帮助我们解决多线程编程中的各种问题。通过合理的使用这些同步机制,我们可以编写出高效、稳定的多线程程序。