概念
线程是执行任务的计算机特性的系统层面表示,是计算的概念在计算机硬件层面的抽象。单一地址空间所有线程可以访问相同的内存位置,但线程间不共享栈,因此局部变量不会产生数据竞争问题。
注意:使用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:
由于cout是一个全局共享对象,因此以上程序输出语句不保证字符输出序列,除非你确认没有两个thread同时向cout写数据。
1构造
C++线程支持如下4种构造函数,线程一旦构造完毕,其任务就会立即执行,并不存在单独地启动操作。
thread() noexcept; (1) (since C++11)
thread( thread&&