[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();
	}
}
相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
weilx12342 天前
C++笔记-文件IO-<fcntl.h>
c++
Smileyqp沛沛2 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·2 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁2 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven2 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
程序猿编码2 天前
告别改源码适配模型:纯 C++ 可配置 LLM 推理引擎,全格式全结构兼容
c++·大模型·llm·推理引擎
此生决int2 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++