[C++] 一个线程打印奇数一个线程打印偶数

要求开辟两个线程打印从0-100的数,一个线程打印奇数一个线程打印偶数,要求必须按照1,2,3,4,5,6...100这种按照顺序打印

  1. 使用std::shared_mutex的版本
cpp 复制代码
#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

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;
}

升级版本

cpp 复制代码
#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)

cpp 复制代码
#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();
	}
}
相关推荐
两颗泡腾片5 小时前
C++提高编程学习--模板
c++·学习
你好!蒋韦杰-(烟雨平生)6 小时前
扫雷游戏C++
c++·单片机·游戏
monicaaaaan6 小时前
搜索二维矩阵Ⅱ C++
c++·线性代数·矩阵
zh_xuan7 小时前
duiLib 自定义资源目录
c++·ui
西红柿煎蛋8 小时前
C++11的可变参数模板 (Variadic Templates) 是如何工作的?如何使用递归解包一个参数包 (parameter pack)?
c++
源代码•宸8 小时前
深入浅出设计模式——创建型模式之原型模式 Prototype
c++·经验分享·设计模式·原型模式
晨曦学习日记8 小时前
Leetcode239:滑动窗口最大值,双端队列的实现!
数据结构·c++·算法
wait a minutes9 小时前
【c++】leetcode763 划分字母区间
开发语言·c++
菜还不练就废了9 小时前
7.25 C/C++蓝桥杯 |排序算法【下】
c语言·c++·排序算法
饭碗的彼岸one9 小时前
重生之我在10天内卷赢C++ - DAY 2
linux·开发语言·c++·笔记·算法·vim