管理线程之线程的ID

线程的标识符是线程ID,线程的ID类型是std::thread::id,可以有两种方式来获取。第一种,可以通过线程关联的thread object,调用object.get_id();如果object没有关联任何线程,那么get_id()返回std::thread::id默认构造函数,即没有线程。另一种方法是在当前运行的线程中调用std::this_thread::get_id()。

线程的ID可以拷贝和比较。如果两个线程ID相等,那么它们是同一个线程,或者它们都没有关联到线程。如果两个ID不同,那么它们是不同的线程,或者它们一个关联到线程,另一个没有关联到线程。

std::thread::id提供了所有的比较操作符。可以使用关联容器、排序或者比较。

常常使用线程ID来判断这个线程是否需要执行某些操作。例如,初始化线程创建了其他线程,用来执行算法的不同部分。这时在创建其他线程前先把自己ID记录下来,之后创建其他线程。然后可以判断当前线程是否是初始化线程。

std::thread::id master_thread;//记录主线程(初始化线程)
void some_core_part_of_algorithm()
{
	if(std::this_thread::get_id()==master_thread)
		{
			//初始化线程的工作
			do_master_thread_work();
		}
		do_common_work();
}

线程ID可以用作关联容器的键。比如,可以使用容器来控制线程来存储信息和线程之间的信息交换。

可以使用流输出来输出线程ID

std::cout<<std::this_thread::get_id();

这个数值其实没有什么意义。标准库只是保证比较两个线程ID时,如果ID相同,那么输出结果相同,否则结果不同。这在调试和记录是非常有用。至于ID具体数值,没什么意义。

时间: 2024-10-30 14:07:36

管理线程之线程的ID的相关文章

开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上,要求输出结果必须按ABC的顺序显示:ABCABC

分类: windows编程 C++ 2012-10-27 15:38 3270人阅读 评论(6) 收藏 举报 第四题(迅雷笔试题):编写一个程序,开启3个线程,这3个线程的ID分别为A.B.C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示:如:ABCABC….依次递推. [cpp] view plaincopy #include <stdio.h> #include <process.h> #include <windows.h> #def

1418作业(8)多线程 开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID 在屏幕上打印10遍

/****************************************************************************** *题目: 编写一个程序,开启3个线程,这3个线程的ID分别为A.B.C,每个线程将自己的ID * 在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示:如:ABCABC-依次递推. ******************************************************************************

让我们一起来实现一个完整的内存管理工具(线程,内存池,萃取)

//让我们开始一个完整的内存管理工具的实现吧. ///准备做一个完整的内存管理工具 //涉及线程,内存池,萃取,不仅仅是new跟delete的重载(或者说是函数重载),这是我的一个雏形,大家谁有什么好的指正谢谢提出,一起学习. #include <iostream> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <list> #include <mal

计算机操作系统学习笔记_2_进程管理 --进程与线程(上)

h3.western { font-family: "Liberation Sans",sans-serif; }h3.cjk { font-family: "微软雅黑"; }h3.ctl { font-family: "AR PL UMing CN"; }h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { fon

FreeOnTerminate 的线程在线程管理类的Destroy释放时手工释放的问题

这个问题折腾了我整整一天. 有一个线程管理类,集中管理所有新建的线程, 线程统一在创建时标识 FreeOnTerminate 为 True. 因为有的线程是不限次循环的,所以在管理类最后 Destroy 时必须对这些线程进行手工停止并释放. 开始代码: FAllThread.Items[i].FOwner := nil; //释放时不必再消息通知管理类删除记录 FAllThread.Items[i].Terminate; 发现 FastMM检测有内存泄露,想了下因为线程还没结束,但主进程结束了,

iOS 多线程 NSThread NSOperation NSOperationQueue GCD 线程锁 线程阻塞

iPhone中的线程应用并不是无节制的,官方给出的资料显示,iPhone OS下的主线程的堆栈大小是1M,第二个线程开始就是512KB,并且该值不能通过编译器开关或线程API函数来更改,只有主线程有直接修改UI的能力,所以一些数据层面可以开辟线程来操作进行,iOS线程的操作方法有NSThread NSOperation NSOperationQueue GCD: NSThread方法有 //NSThread自动 - (IBAction)didClickNSThreadAutoButtonActi

Android线程与线程池

一.特殊的线程 1.AsynTask 底层用到了线程池,封装了线程池和Handler,主要是为了方便开发者在子线程中更新UI 2.IntentService(不完整???) 内部采用HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出,底层直接使用了线程(从任务执行的角度来看,IntentService的作用很像一个后台线程,但是IntentService是一种服务,他不容易被系统杀死从而可以尽量保证任务的执行) 3.HandlerThread 是一种具有消

菜鸟之旅——学习线程(线程和线程池)

愉悦的绅士 菜鸟之旅--学习线程(线程和线程池) 上一篇主要介绍了进程和线程的一些基本知识,现在回归正题,我们来学一下线程的使用,本篇主要是使用新建线程和线程池的方式. 线程 先来介绍简单的线程使用:使用new方法来创建线程,至于撤销线程,我们不必去管(我也不知道怎么去管XD),因为CLR已经替我们去管理了. 创建 先来看一个简单的使用线程的例子: static void Main(string[] args) { Thread t1 = new Thread(Menthod1); Thread

线程同步--线程间通信

一.线程同步 线程的同步方法跟其他系统下类似,我们可以用原子操作,可以用 mutex,lock 等. iOS 的原子操作函数是以 OSAtomic 开头的,比如:OSAtomicAdd32, OSAtomicOr32 等等.这些函数可以直接使用,因为它 们是原子操作. iOS 中的 mutex 对应的是 NSLock,它遵循 NSLooking 协议,我们可以使用 lock, tryLock, lockBeforeData:来加锁,用 unLock 来解锁.使用示例: BOOL moreToDo