C++标准库之线程

本文介绍了C++标准库中的线程概念,包括线程的身份表示、构造、析构、join()和detach()方法。线程通过std::thread::id标识,构造时任务立即执行,析构需要确保线程已join或detach,join()会阻塞等待线程结束,而detach()使线程独立执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

线程是执行任务的计算机特性的系统层面表示,是计算的概念在计算机硬件层面的抽象。单一地址空间所有线程可以访问相同的内存位置,但线程间不共享栈,因此局部变量不会产生数据竞争问题。
注意:使用C++标准库线程API需要包含头文件 #include < thread >

0身份

每个执行线程都有一个唯一的标识,用std::thread::id表示,id是一个轻量级的可拷贝的类,其所对应的值与某一线程一一对应,如果该线程结束了,那么该值可以与另一个线程相关联。通过成员函数*get_id()*我们可以获取指定线程ID。

样例代码:
#include <cstdlib>		// system()
#include <iostream>      // std::cout
#include <string>		// std::string
#include <thread>		// std::thread,	std::this_thread
#include <chrono>		// std::chrono::seconds

/**
  * 获取参数指定的线程的线程ID
  */
void print_id(std::string str, std::thread& t)
{
	if (t.get_id() == std::thread::id{}) {
		std::cout << str <<" not joinable\n";
	}
	else {
		std::cout << str << "'s id is " << t.get_id() << std::endl;
	}
}

void task1(void)
{
	for (int i = 0; i < 5; i++)
	{
		std::cout << i << std::endl;
		std::this_thread::sleep_for(std::chrono::seconds{1});
	}
}

int main(int argc, char *argv[])
{
	std::thread t0{ task1 };
	print_id("t0", t0);
	t0.join();
	system("pause");
	return 0;
}
Possible output:

Possible output
由于cout是一个全局共享对象,因此以上程序输出语句不保证字符输出序列,除非你确认没有两个thread同时向cout写数据。

1构造

C++线程支持如下4种构造函数,线程一旦构造完毕,其任务就会立即执行,并不存在单独地启动操作。

thread() noexcept;											(1)	(since C++11)
thread( thread&&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值