[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();
	}
}
相关推荐
dapeng28701 小时前
分布式系统容错设计
开发语言·c++·算法
qq_417695051 小时前
代码热修复技术
开发语言·c++·算法
C++ 老炮儿的技术栈7 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
hz_zhangrl7 小时前
CCF-GESP 等级考试 2026年3月认证C++一级真题解析
开发语言·c++·gesp·gesp2026年3月·gespc++一级
Liu628887 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
波特率1152008 小时前
const关键字与函数的重载
开发语言·c++·函数重载
干啥啥不行,秃头第一名9 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
2301_807367199 小时前
C++中的解释器模式变体
开发语言·c++·算法
2301_8194143011 小时前
C++与区块链智能合约
开发语言·c++·算法
不想看见40411 小时前
Valid Parentheses栈和队列--力扣101算法题解笔记
开发语言·数据结构·c++