C++11并发编程:多线程std::thread
一:概述
C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改。现在在C++11中只需使用语言层面的thread可以解决这个问题。
所需头文件<thread>
二:构造函数
1.默认构造函数
thread() noexcept
一个空的std::thread执行对象
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, );
3.拷贝构造函数
thread(const thread&) = delete;
拷贝构造函数被禁用,std::thread对象不可拷贝构造
void threadFun(int& a)
{
cout << "this is thread fun !" << endl;
} int value = ;
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 = ;
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 ;
}
2.创建线程,传参
void threadFun1(int v)
{
cout << "this is thread fun1 !" << endl;
cout << v << endl;
} int main()
{
int value = ;
thread t1(threadFun1, value);
t1.join(); getchar();
return ;
}
需要注意,变量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 = ;
thread t1(threadFun1, std::ref(value));
t1.join(); getchar();
return ;
}
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 ;
}
扫码关注公众号
专注分享C/C++,C++(11,14,17),STL,Java,Spring,mybatis,mysql,redis,分布式,高并发,设计模式,爬虫,docker,shell编程等相关技术,还有高薪互联网职位内推,在这里一起探讨,一起学习,一起进步,同时不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣!
最新文章
- hdu.1044.Collect More Jewels(bfs + 状态压缩)
- BZOJ2159 : Crash 的文明世界
- 使用java配置定时任务的几种配置方式及示例
- Mysql连接测试代码
- leetcode Database3(Nth Highest Salary<;—>;Consecutive Numbers<;—>;Department Highest Salary)
- http://www.aboutyun.com/thread-8792-1-1.html
- 对方网络ping不通
- [Lua]Lua高级教程Metatables
- FNV算法实战
- [HAOI 2006]旅行comf
- Porsche Piwis II V14. three hundred and fifty computer software Tester II
- python_数据类型
- swift的类型约束
- [转]React 教程
- C/C++服务器开发的必备利器–libconfig
- HDUOJ----1181 变形课
- [svc]samba服务搭建
- 原生与JS交互 iOS
- 用js 的for循环打印三角形,提取水仙花数,求本月多少天
- mogodb优化