目录
1、线程的创建
头文件<thread>,作用域为标准作用域。
//创建线程对象
thread t1;
//创建线程并启动线程或是抛出异常
thread t2(ThreadFunction);
//移动语义,t3替代t2当前状态,并将t2赋值为nonjionable
thread t3(move(t2));
//将t2的状态move assign至t1,如果t1是joinable则调用terminate
t1 = move(t3);
//创建线程ID
std::thread::id ID;
2、成员函数
//如果对象是joinable就返回独一无二的thread::id,反之返回thread::id()
t1.get_id();
//等待关联线程完成工作,然后令object变成nonjoinable
t1.join();
//解除t和线程之间的关联,并让线程继续运行,并令object变成nonjoinable。不要让分离的线程访问程序变量。线程最好是传值进去
t1.detach();
//判断对象是否有一个关联的线程
t1.joinable();
3、this_thread
this_thread::get_id(); //获取线程ID
this_thread::sleep_for(chrono::seconds(10)); //将某个线程阻塞dur时间段
this_thread::sleep_until(tp); //将某个线程阻塞直到时间点
this_thread::yield(); //建议释放控制以便重新调度让下一个线程能够执行,放弃当前线程创新分配资源。慎用。
4、例子
#include <iostream>
#include <thread>
#include <vector>
#include <string>
#include <sstream>
#include <chrono>
#include <ctime>
#include <iomanip>
using namespace std;
#pragma warning(disable:4996) //去掉安全属性
void ThreadFunction()
{
cout << "获得当前线程ID " << this_thread::get_id() << endl;
//线程分离后不可以时间等待
//将某个线程阻塞dur时间段
this_thread::sleep_for(chrono::seconds(10));
time_t time = chrono::system_clock::to_time_t(chrono::system_clock::now());
struct tm * ptm = std::localtime(&time);
cout << "Current time: " << put_time(ptm, "%X") << '\n';
cout << "Waiting for the next minute to begin...\n";
++ptm->tm_min; ptm->tm_sec = 0;
//将某个线程阻塞直到时间点
this_thread::sleep_until(chrono::system_clock::from_time_t(mktime(ptm)));
//建议释放控制以便重新调度让下一个线程能够执行,放弃当前线程创新分配资源
//this_thread::yield();
}
int main()
{
//创建线程对象
thread t1;
//创建线程并启动线程或是抛出异常
thread t2(ThreadFunction);
//移动语义,t3替代t2当前状态,并将t2赋值为nonjionable
thread t3(move(t2));
//销毁*this,如果object是joinable则调用,std::terminate。
//t3.~thread();
//将t2的状态move assign至t1,如果t1是joinable则调用terminate
t1 = move(t3);
//判断对象是否有一个关联的线程
cout << "对象是否有一个关联的线程 " << t1.joinable();
//如果对象是joinable就返回独一无二的thread::id,反之返回thread::id()
t1.get_id();
//等待关联线程完成工作,然后令object变成nonjoinable
t1.join();
//解除t和线程之间的关联,并让线程继续运行,并令object变成nonjoinable。确保在程序结束前,线程完成任务。
//t1.detach();
system("pause");
}
运行结果:
获得当前线程ID 15248对象是否有一个关联的线程 1
Current time: 17:52:25
Waiting for the next minute to begin...
请按任意键继续. . .