要求开辟两个线程打印从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();}
}