[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();
	}
}
相关推荐
玖玥拾9 小时前
C/C++ 基础笔记(十四)多态与模板编程
c语言·c++·多态·模板
Roann_seo%9 小时前
C++文件操作完全指南:从文本读写到二进制文件处理
开发语言·c++
坚果派·白晓明10 小时前
【鸿蒙PC】SDL3 适配:AtomCode + Skills 快速集成 NAPI 测试工具
c++·华为·ai编程·harmonyos·atomcode
凡人叶枫11 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
凡人叶枫12 小时前
Effective C++ 条款16:成对使用 new 和 delete 时要采取相同形式
开发语言·c++·effective c++
不吃土豆的马铃薯12 小时前
C++ 高性能网络缓冲区 Buffer 源码解析
linux·服务器·开发语言·网络·c++
.千余13 小时前
【C++】C++继承入门(下):友元、静态成员与菱形继承的底层逻辑
开发语言·c++·笔记·学习·其他
初中就开始混世的大魔王13 小时前
6 Fast DDS-传输层
开发语言·c++·中间件·信息与通信
代码中介商15 小时前
C++ 智能指针完全指南(三):weak_ptr 与循环引用
开发语言·c++
BestOrNothing_201516 小时前
ROS2 C++ 小车控制完整实战(二):自定义 msg 消息发布与订阅保姆级教程
c++·ros2·subscriber·publisher·msg·topic通信·自定义接口