C++识别线程

#include <iostream>
#include<thread>
#include<string>
#include <unordered_map>
#include <sstream>
//获得线程的id
//获取当前线程的id
void Print() {
	std::cout << "进入新线程的id为:" << std::this_thread::get_id() << '\n';
}
void Test1() {
	//调用this_thread的静态方法get_id可以查看当前线程的id
	std::cout << "主线程的id为:" << std::this_thread::get_id() << '\n';
	std::thread t(Print); //创建新线程
	t.join();
	//调用thread对象的方法get_id()来查看自身的线程id
	std::thread t1(Print);
	std::cout << "调用新的线程1的id为:" << t1.get_id() << '\n';
	std::thread t2(Print);
	std::cout << "调用新的线程2的id为:" << t2.get_id() << '\n';
	t1.join();
	t2.join();
	//线程没有关联任何函数,则get_id返回0
	std::thread t3;
	std::cout << "没有关联函数的线程3的id为:" << t3.get_id() << '\n';
}
//C++标准库中有thread::id 作为键值的哈希映射,故可以使用unordered_map
//用线程id作为哈希键值
std::unordered_map<std::thread::id, std::string>threadDataMap; //哈希映射
void ThreadFunction() {
	std::thread::id thread_id = std::this_thread::get_id(); // 获取当前线程的id
	//将id转为string类型
	std::stringstream ss;
	ss << thread_id;
	std::string thread_string = ss.str();
	threadDataMap[thread_id] = "Thread Data For "+thread_string;
}
//使用哈希表存储线程id和内容
void Test2() {
	std::thread t1(ThreadFunction);
	t1.join();
	std::thread t2(ThreadFunction);
	t2.join();
	std::thread t3(ThreadFunction);
	t3.join();

	for (auto& [key, val] : threadDataMap) {
		std::cout << "Thread ID = " << key << ", Data = " << val << "\n";
	}
}
//用线程id来确定是否是主线程,然后进行操作
std::thread::id master_id; //主线程
void do_some_core_work() {
	std::cout << "主线程进行重要的工作!" << "\n";
}
void do_some_common_work() {
	std::cout << "其他线程做一些基本的工作!" << "\n";
}
void check() {
	if (std::this_thread::get_id() == master_id) { //如果是主线程
		do_some_core_work();
	}
	else { //其他线程
		do_some_common_work();
	}
}
void Test3() {
	master_id = std::this_thread::get_id();
	check();
	std::thread t1(check);
	std::thread t2(check);
	t1.join();
	t2.join();
}
int main(){
	//Test1();
	//Test2();
	Test3();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值