std::thread:代表单独的线程对象。同一进程中的线程共享同一个地址空间。一个初始化的thread对象代表一个激活的线程,该对象是joinable的,有唯一的线程id。一个只构造但没有初始化的线程对象是non-joinable的线程,所有non-joinable的线程的id都是一样的。对joinable的线程执行join()或者detach()操作后,该线程就变成non-joinable的了。
构造函数:
default (1) thread() noexcept;
initialization (2) template <class Fn, class... Args>
explicit thread (Fn&& fn, Args&&... args);
copy [deleted] (3) thread (const thread&) = delete;不支持拷贝构造函数
move (4) thread (thread&& x) noexcept;
join(): 当线程执行完成时,函数返回调用线程(与调用线程join汇合)。这将使函数返回的时刻与线程中所有操作的完成保持同步:这将阻塞调用该函数的线程的执行,直到在构造时被调用的函数返回(如果还没有返回)。调用过该函数后,thread对象就变成non-joinable的了,可以被安全地销毁。
可以发现“1 threads joined!”输出之前三个线程都有输出,线程1执行完之后,该消息就会被打印。
#include <iostream>
#include <thread>
void pause_thread(int n){
for(int i=0; i<n; i++){
std::cout << "thread id: " << std::this_thread::get_id() << " i: " << i <<"\n";
}
}
int main(){
std::thread th1(pause_thread, 1000);
std::thread th2(pause_thread, 2000);
std::thread th3(pause_thread, 3000);
std::cout << "Done spawning threads. Now waiting for them to join.\n";
th1.join();
std::cout << "1 threads joined!\n";
th2.join();
std::cout << "2 threads joined!\n";
th3.join();
std::cout << "All threads joined!\n";
return 0;
}
detach(): 将对象表示的线程与调用线程分离,允许它们彼此独立执行。两个线程在没有阻塞或同步的情况下继续运行。 注意,当任何一个结束执行时(调用线程或者当前对象代表的线程),它的资源都会被释放。
#include <iostream>
#include <thread>
#include <chrono>
void pause_thread(int n){
for(int i=0; i<n; i++){
std::cout << "thread id: " << std::this_thread::get_id() << " i: " << i <<"\n";
}
}
int main(){
std::thread th1(pause_thread, 1000);
std::thread th2(pause_thread, 2000);
std::thread th3(pause_thread, 3000);
std::cout << "Done spawning threads. Now waiting for them to detach.\n";
th1.detach();
std::cout << "1 threads detached!\n";
th2.detach();
std::cout << "2 threads detached!\n";
th3.detach();
std::cout << "All threads detached!\n";
//调用线程sleep 5s,让子线程有时间执行完毕,否则当主线程退出时,子线程的资源就会被释放掉。
std::this_thread::sleep_for(std::chrono::seconds(5));
std::cout << "sleep 5s\n";
return 0;
}
参考https://www.cplusplus.com/reference/thread/thread/