本篇文章主要用于记录与传播在实例中使用std::thread的实践心得
创建一个线程
#include <iostream>
#include <thread>
#include <chrono>
void thread_call(const std::string& strTest){
std::cout << strTest.c_str() << "\n";
}
int main(int argc, char const *argv[])
{
std::thread t1(thread_call, "test t1");
t1.detach();
std::thread t2([](int n){std::cout << n << std::flush;}, 123);
t2.join();
// std::this_thread::yield();
// std::this_thread::sleep_for(std::chrono::seconds(1));
getchar();
return 0;
}
输出结果如下:
以上输出结果为正常情况。非正常情况输出顺序将会不确定。
detach 与 join
detach 是为了将创建的子线程与主线程分离, 即主线程不等待子线程执行完毕即可退出。
join 与detach相反, join将时调用线程处于阻塞状态, 直到子线程执行完毕才返回。
注意: 在启动一个线程后, 要么调用detach, 要么调用join,否则会出现异常情况。
yield 与 sleep_for
std::this_thread::yield()
方法调用时, 将主动让出CPU时间片, 注意让出时间为CPU时间片, 让其他线程有机会运行。 不定时间后将会参与系统的CPU调度。
std::this_thread::sleep_for()
方法调用时, 同样会让出CPU, 并且休眠指定时间后, 将参与系统的CPU调度。