C++11并发编程:多线程std::thread

C++11并发编程:多线程std::thread,第1张

概述今天小编就为大家分享一篇关于C++11并发编程:多线程std::thread,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

一:概述

C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改。现在在C++11中只需使用语言层面的thread可以解决这个问题。

所需头文件

二:构造函数

1.默认构造函数

thread() noexcept

一个空的std::thread执行对象

2.初始化构造函数

template

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转换成整形值,所需头文件

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;

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对内存溢出的支持。如果你想了解更多相关内容请查看下面相关链接

总结

以上是内存溢出为你收集整理的C++11并发编程:多线程std::thread全部内容,希望文章能够帮你解决C++11并发编程:多线程std::thread所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1264519.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存