C++实现建立三个线程A、B、C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。
时间: 2024-03-04 14:48:15 浏览: 19
下面是一个基于C++11的实现,使用了互斥锁和条件变量来实现线程的同步和互斥。
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
int count = 0;
const int kMaxCount = 30;
void print(char ch, int num) {
for (int i = 0; i < num; ++i) {
std::unique_lock<std::mutex> lock(mtx);
while (count % 3 != ch - 'A') {
cv.wait(lock);
}
std::cout << ch;
++count;
cv.notify_all();
}
}
int main() {
std::thread threadA(print, 'A', 10);
std::thread threadB(print, 'B', 10);
std::thread threadC(print, 'C', 10);
threadA.join();
threadB.join();
threadC.join();
std::cout << std::endl;
return 0;
}
```
其中,`print`函数接收两个参数,一个是要打印的字符,另一个是打印的次数。在函数内部,我们使用`std::unique_lock<std::mutex>`来获取互斥锁,并使用`while`循环和`std::condition_variable`来实现线程的等待和唤醒。具体地,当目前正在执行的线程不是需要打印的线程时,我们调用`cv.wait(lock)`来释放互斥锁并等待唤醒。一旦被唤醒,我们再次获取互斥锁并打印字符,同时递增`count`计数器,并通过`cv.notify_all()`来唤醒其他线程。
在`main`函数中,我们创建三个线程并分别传入不同的字符和打印次数,然后等待三个线程执行完毕后输出换行符。如果一切正常,程序应该输出:`ABCABCABCABCABCABCABCABCABCABC`。