一、使用条件等待方式
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>
bool readyPrintNumbers = false;
bool readyPrintLetters = false;
std::mutex m;
std::condition_variable cv;
int index = 0;
void printNumblers()
{
for (int i = 0; i < 26; i++)
{
std::unique_lock<std::mutex> lk(m);
cv.wait(lk, [] {return readyPrintNumbers; });
std::cout << i + 1 << " ";
readyPrintNumbers = false;
readyPrintLetters = true;
cv.notify_one();// 通知 已经准备好 【打印字母】
}
}
void printLetters()
{
for (int i = 0; i < 26; i++)
{
std::unique_lock<std::mutex> lk(m);
cv.wait(lk, [] {return readyPrintLetters; });
std::cout << (char)(i + 'A');
readyPrintNumbers = true;
readyPrintLetters = false;
cv.notify_one();// 通知 已经准备好 【打印数字】
}
}
int main()
{
std::thread t1(printNumblers), t2(printLetters);//首先创建两个线程和两个函数。
std::cout << "start main()\n";//main函数开始
readyPrintNumbers = true;
cv.notify_one();// 通知 已经准备好 【打印数字】
t1.join();
t2.join();
std::cout << "\n end main()\n";
return 0;
}
二、使用atomic方式
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <atomic>
using std::cout; using std::endl;
std::mutex m;
std::atomic<bool> readyPrintNumbers(false);
std::atomic<bool> readyPrintLetters(false);
void printNumbers()
{
for (int i = 0; i < 26; i++)
{
while (!readyPrintNumbers.load())
{
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
cout << i + 1 << " ";
readyPrintNumbers.store(false);
readyPrintLetters.store(true);
}
}
void printLetters()
{
for (int i = 0; i < 26; i++)
{
while (!readyPrintLetters.load())
{
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
cout << (char)('A' + i);
readyPrintNumbers.store(true);
readyPrintLetters.store(false);
}
}
int main()
{
std::thread t1(printNumbers), t2(printLetters);//首先创建两个线程和两个函数。
std::cout << "start main()\n";//main函数开始
readyPrintNumbers.store(true);
t1.join();
t2.join();
std::cout << "\n end main()\n";
return 0;
}