多线程顺序打印输出数据

Posted 清水寺扫地僧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程顺序打印输出数据相关的知识,希望对你有一定的参考价值。

同花顺技术面手撕代码题,考察线程同步的实现。


题目

有三个线程,编号分别为①②③,其中
①线程打印1,4,7,10,...;
②线程打印2,5,8,11,...;
③线程打印3,6,9,12,...;
如何编程,使得在STDOUT中的输出是顺序的,即输出是
1,2,3,4,5,6,7,8,9,...,100

题解

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <Windows.h>

using namespace std;

mutex mtx;
int idx;

void print_idx(bool (*isTurn)(int)) { //作为启动线程的句柄,
	while (1) {
		mtx.lock();
		if (idx > 100) break;
		if (isTurn(idx)) {
			cout << idx << " ";
			idx++;
		} 
		mtx.unlock();
	}
}

bool thd1_judge(int a) { return 1 == a % 3; } //判断是否是①线程
bool thd2_judge(int a) { return 2 == a % 3; } //判断是否是②线程
bool thd3_judge(int a) { return 0 == a % 3; } //判断是否是③线程

int main() {
	idx = 1; //初始化全局共享变量
	thread thd1 = thread(print_idx, thd1_judge); //启动线程,分别是入口函数和
	thread thd2 = thread(print_idx, thd2_judge); //入口函数参数
	thread thd3 = thread(print_idx, thd3_judge);
	thd1.join(); //回收线程
	thd2.join();
	thd3.join();
	return 0;
}

题解当中的thdx_judge作为函数参数,即函数指针参数的用法,可见剑指Offer当中面试题21:调整数组顺序使奇数位于偶数前面


输出结果

以上是关于多线程顺序打印输出数据的主要内容,如果未能解决你的问题,请参考以下文章

JUC并发编程 多线程设计模式 -- 同步模式之顺序控制( 固定运行顺序 & 交替输出)

java多线程笔记--顺序执行

多线程顺序打印

多线程顺序打印

多处理后管理打印输出顺序

python多线程运行顺序问题