C++线程thread

目录

1、线程的创建

2、成员函数

3、this_thread

4、例子


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...
请按任意键继续. . .
发布了44 篇原创文章 · 获赞 54 · 访问量 7041

猜你喜欢

转载自blog.csdn.net/Liu_Xiao_Ming/article/details/104126203