时间:2021-05-20
一:概述
C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改。现在在C++11中只需使用语言层面的thread可以解决这个问题。
所需头文件<thread>
二:构造函数
1.默认构造函数
2.初始化构造函数
template<class Fn, class... Args>
explicit thread(Fn&& fn, Args&&... args);
创建std::thread执行对象,线程调用threadFun函数,函数参数为args。
void threadFun(int a){ cout << "this is thread fun !" << endl;}thread t1(threadFun, 2);3.拷贝构造函数
thread(const thread&) = delete;
拷贝构造函数被禁用,std::thread对象不可拷贝构造
void threadFun(int& a){ cout << "this is thread fun !" << endl;} int value = 2;thread t1(threadFun, std::ref(value));4.Move构造函数
thread(thread&& x)noexcept
调用成功原来x不再是std::thread对象
void threadFun(int& a){ cout << "this is thread fun !" << endl;} int value = 2;thread t1(threadFun, std::ref(value));thread t2(std::move(t1));t2.join();三:成员函数
1.get_id()
获取线程ID,返回类型std::thread::id对象。
thread t1(threadFun);thread::id threadId = t1.get_id();cout << "线程ID:" << threadId << endl;//threadId转换成整形值,所需头文件<sstream>ostringstream oss;oss << t1.get_id();string strId = oss.str();unsigned long long tid = stoull(strId);cout << "线程ID:" << tid << endl;2.join()
创建线程执行线程函数,调用该函数会阻塞当前线程,直到线程执行完join才返回。
thread t1(threadFun);t1.join() //阻塞等待3.detach()
detach调用之后,目标线程就成为了守护线程,驻留后台运行,与之关联的std::thread对象失去对目标线程的关联,无法再通过std::thread对象取得该线程的控制权。
4.swap()
交换两个线程对象
thread t1(threadFun1);thread t2(threadFun2);cout << "线程1的ID:" << t1.get_id() << endl;cout << "线程2的ID:" << t2.get_id() << endl;t1.swap(t2);cout << "线程1的ID:" << t1.get_id() << endl;cout << "线程2的ID:" << t2.get_id() << endl;5.hardware_concurrency()
获得逻辑处理器储量,返回值为int型
int coreNum = thread::hardware_concurrency();四:使用
1.创建线程
void threadFun1(){ cout << "this is thread fun1 !" << endl;}int main(){ thread t1(threadFun1); t1.join(); getchar(); return 1;}2.创建线程,传参
void threadFun1(int v){ cout << "this is thread fun1 !" << endl; cout << v << endl;}int main(){ int value = 6; thread t1(threadFun1, value); t1.join(); getchar(); return 1;}需要注意,变量int value 和int v 做变量传递时并不是引用,而是对变量做了拷贝,所以在传递给int v前,int value不能出作用域(释放了内存),join(),可以保证int value变量释放内存,如果使用detach(),可能存在这种情况。
3.创建线程,引用传参
void threadFun1(int& v){ cout << "this is thread fun1 !" << endl; cout << v << endl;}int main(){ int value = 6; thread t1(threadFun1, std::ref(value)); t1.join(); getchar(); return 1;}4.创建建线程,线程函数为类成员函数
class Object{public: Object() { cout << "构造函数" << endl; } ~Object() { cout << "析构函数" << endl; } void fun(string info) { cout << info << endl; }};int main(){ Object obj; string str = "我是一个类的成员函数!"; thread t1(&Object::fun, &obj, str); t1.join(); getchar(); return 1;}总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前面两讲《C++11并发指南二(std::thread详解)》,《C++11并发指南三(std::mutex详解)》分别介绍了std::thread和std::
上一篇博客《C++11并发指南一(C++11多线程初探)》中只是提到了std::thread的基本用法,并给出了一个最简单的例子,本文将稍微详细地介绍std::
1,简介C++11中加入了头文件,此头文件主要声明了std::thread线程类。C++11的标准类std::thread对线程进行了封装,定义了C++11标准
前言C++11中提供了异步线程接口std::async,std::async是异步编程的高级封装,相对于直接使用std::thread,std::async的优
c++11之后有了标准的线程库:std::thread。之前一些编译器使用C++11的编译参数是-std=c++11g++-std=c++11test.cpps