[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++·算法
岁忧2 小时前
(LeetCode 面试经典 150 题 ) 58. 最后一个单词的长度 (字符串)
java·c++·算法·leetcode·面试·go
码农编程录3 小时前
【c/c++3】类和对象,vector容器,类继承和多态,systemd,std&boost
c++
??tobenewyorker5 小时前
力扣打卡第二十一天 中后遍历+中前遍历 构造二叉树
数据结构·c++·算法·leetcode
oioihoii6 小时前
C++11 forward_list 从基础到精通:原理、实践与性能优化
c++·性能优化·list
m0_687399846 小时前
写一个Ununtu C++ 程序,调用ffmpeg API, 来判断一个数字电影的视频文件mxf 是不是Jpeg2000?
开发语言·c++·ffmpeg
Ronin3057 小时前
【C++】类型转换
开发语言·c++
mrbone117 小时前
Git-git worktree的使用
开发语言·c++·git·cmake·worktree·gitab
虾球xz9 小时前
CppCon 2018 学习:EFFECTIVE REPLACEMENT OF DYNAMIC POLYMORPHISM WITH std::variant
开发语言·c++·学习
津津有味道10 小时前
Qt C++串口SerialPort通讯发送指令读写NFC M1卡
linux·c++·qt·串口通信·serial·m1·nfc