要求开辟两个线程打印从0-100的数,一个线程打印奇数一个线程打印偶数,要求必须按照1,2,3,4,5,6…100这种按照顺序打印
- 使用std::shared_mutex的版本
#ifndef PrintNumber2_H_
#define PrintNumber2_H_
#include <shared_mutex>
class PrintNumber2 {
public:
void PrintOdd();
void PrintEven();
private:
int m_num = 1;
std::shared_mutex m_mutex;
};
#endif
#include "PrintNumber2.h"
#include <iostream>
void PrintNumber2::PrintOdd()
{
while (true) {
m_mutex.lock_shared();
if (m_num <= 100) {
if (m_num % 2 == 1) {
m_mutex.unlock_shared();
std::cout << "奇线程 :" << m_num << std::endl;
m_mutex.lock();
++m_num;
m_mutex.unlock();
}
else {
m_mutex.unlock_shared();
}
}
else {
m_mutex.unlock_shared();
break;
}
}
}
void PrintNumber2::PrintEven()
{
while (true) {
m_mutex.lock_shared();
if (m_num <= 100) {
if (m_num % 2 == 0) {
m_mutex.unlock_shared();
std::cout << "偶线程 :" << m_num << std::endl;
m_mutex.lock();
++m_num;
m_mutex.unlock();
}
else {
m_mutex.unlock_shared();
}
}
else {
m_mutex.unlock_shared();
break;
}
}
}
main.cpp
#include <iostream>
#include <thread>
#include "PrintNumber.h"
#include "PrintNumber2.h"
int main()
{
//PrintNumber printNumber;
//std::thread thread1(&PrintNumber::printOdd, &printNumber);
//std::thread thread2(&PrintNumber::printEven, &printNumber);
//thread1.join();
//thread2.join();
PrintNumber2 printNumber;
std::thread thread1(&PrintNumber2::PrintOdd, &printNumber);
std::thread thread2(&PrintNumber2::PrintEven, &printNumber);
thread1.join();
thread2.join();
return 0;
}
升级版本
#include "PrintNumber2.h"
#include <iostream>
void PrintNumber2::PrintOdd()
{
while (true) {
std::shared_lock<std::shared_mutex> sharedLock(m_mutex);
if (m_num <= 100) {
if (m_num % 2 == 1) {
sharedLock.unlock();
std::cout << "奇线程 :" << m_num << std::endl;
std::lock_guard<std::shared_mutex> lockGuard(m_mutex);
++m_num;
}
else {
sharedLock.unlock();
}
}
else {
break;
}
}
}
void PrintNumber2::PrintEven()
{
while (true) {
std::shared_lock<std::shared_mutex> sharedLock(m_mutex);
if (m_num <= 100) {
if (m_num % 2 == 0) {
sharedLock.unlock();
std::cout << "偶线程 :" << m_num << std::endl;
std::lock_guard<std::shared_mutex> lockGuard(m_mutex);
++m_num;
}
else {
sharedLock.unlock();
}
}
else {
break;
}
}
}
使用条件变量版本(可以避免空转耗费cpu)
#include "PrintNumber.h"
#include <iostream>
void PrintNumber::printOdd()
{
while (true) {
std::unique_lock<std::mutex> lock(m_mutex);
m_cv.wait(lock, [this]() {return m_isOddTurn || m_num > 100; });
if (m_num > 100) {
break;
}
std::cout << "奇线程 : " << m_num << std::endl;
++m_num;
m_isOddTurn = false;
m_cv.notify_all();
}
}
void PrintNumber::printEven()
{
while (true) {
std::unique_lock<std::mutex> lock(m_mutex);
m_cv.wait(lock, [this]() {return !m_isOddTurn || m_num > 100; });
if (m_num > 100) {
break;
}
std::cout << "偶线程 : " << m_num << std::endl;
++m_num;
m_isOddTurn = true;
m_cv.notify_all();
}
}