c++中的多线程

使用 std::thread 时需要包含 #include<thread> 头文件,定义了表示线程的类、用于互斥访问的类与方法等。

参考网址:

  • https://blog.csdn.net/liuker888/article/details/46848905
  • https://blog.csdn.net/fengbingchun/article/details/73393229

成员类型和成员函数:

std::thread中主要声明三类函数:(1)、构造函数、拷贝构造函数(拷贝构造函数被禁用,意味着thread不可被拷贝构造,但能被转移(move)或者互换(swap))及析构函数;(2)、成员函数;(3)、静态成员函数(hardware_concurrency,检测硬件并发特性。

构造函数如下:

一些相关的数据结构和存储位置:

    //栈上  thread t1(show);   //根据函数初始化执行  thread t2(show);  thread t3(show);  //线程数组  thread th[3]{thread(show), thread(show), thread(show)};   //堆上  thread *pt1(new thread(show));  thread *pt2(new thread(show));  thread *pt3(new thread(show));  //线程指针数组  thread *pth(new thread[3]{thread(show), thread(show), thread(show)}); 

  线程初始化(如下实现了多线程传递参数)

void show(const char *str, const int id);
int main()  
{  thread t1(show, "hello!", 0);  //三个参数分别为函数名,以及其两个参数thread t2(show, "C++!", 1);  return 0;  
}  

  join:调用该函数会阻塞当前线程。阻塞调用者(caller)所在的线程直至被join的std::thread对象标识的线程执行结束;

  detach:将当前线程对象所代表的执行实例与该线程对象分离,使得线程的执行可以单独进行。一旦线程执行完毕,它所分配的资源将会被释放。

    • 在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。
    • threads.joinable() 判断线程是否可以join     ;threads.join();//主线程等待当前线程执行完成再退出 ; th.detach();

//脱离主线程的绑定,主线程挂了,子线程不报错,子线程执行完自动退出。  //detach以后,子线程会成为孤儿线程,线程之间将无法通信。 

---------------------------------

  获取CPU核心个数:

n = thread::hardware_concurrency();//获取cpu核心个数 

  原子变量与线程安全:线程之间会有冲突(下面的代码可能存在num++重叠的现象)

  • 互斥量:
#include<iostream>  
#include<thread>  
#include<mutex>  
using namespace std;  
const int N = 100000000;  
int num(0);  
mutex m;  
void run()  
{  for (int i = 0; i < N; i++)  {  m.lock();  num++;  m.unlock();  }  
}  
int main()  
{  clock_t start = clock();  thread t1(run);  thread t2(run);  t1.join();  t2.join();  clock_t end = clock();  cout << "num=" << num << ",用时 " << end - start << " ms" << endl;  return 0;  
}  

 存在问题:计算速度很慢,原因主要是互斥量加解锁需要时间 。std::mutex。

  • 原子变量:
#include<iostream>  
#include<thread>  
#include<atomic>  
using namespace std;  
const int N = 100000000;  
atomic_int num{ 0 };//不会发生线程冲突,线程安全  
void run()  
{  for (int i = 0; i < N; i++)  {  num++;  }  
}  
int main()  
{  clock_t start = clock();  thread t1(run);  thread t2(run);  t1.join();  t2.join();  clock_t end = clock();  cout << "num=" << num << ",用时 " << end - start << " ms" << endl;  return 0;  
}  

  通过原子变量后运算结果正确,计算速度一般。参考std::atomic

但其实只要使用join,可以提升计算的速度

    thread t1(run);  t1.join();  //结束才回到主线程thread t2(run);  t2.join(); 

  ------------------------

时间等待的问题

#include<iostream>  
#include<thread>  
#include<chrono>  
using namespace std;  
int main()  
{  thread th1([]()  {  //让线程等待3秒  this_thread::sleep_for(chrono::seconds(3));  //让cpu执行其他空闲的线程  this_thread::yield();  //线程id  cout << this_thread::get_id() << endl;  });  return 0;  
}
  • yield()函数可以用来将调用者线程跳出运行状态,重新交给操作系统进行调度,即当前线程放弃执行,操作系统调度另一线程继续执行;
  • sleep_until()函数是将线程休眠至某个指定的时刻(time point),该线程才被重新唤醒;
  • sleep_for()函数是将线程休眠某个指定的时间片(time span),该线程才被重新唤醒,不过由于线程调度等原因,实际休眠实际可能比sleep_duration所表示的时间片更长。

-------------------------------

线程的交换使用 swap(t1, t2);

线程移动使用thread t2 = move(t1);

转载于:https://www.cnblogs.com/zhang-qc/p/8671248.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ reverse memcpy

C reverse memcpy前言基于QT的测试样例结果前言 C 实现翻转memcpy 基于QT的测试样例 代码如下&#xff1a; #include <iostream> #include <QtCore/QCoreApplication> #include <QDebug>using namespace std;void *reversememcpy(void *out, const void *…

打架程序_学生打架不知道怎么处理?一般程序了解下,对你或许有帮助

很多新老师&#xff0c;对处理学生问题的步骤其实还不是很了解&#xff0c;一遇到学生问题就很苦恼&#xff0c;用的方法很多&#xff1a;或劝、或骂、或赏、或罚&#xff0c;但总是觉得不得要领。今天我想通过昨天我处理的一个实例&#xff0c;针对性的聊一聊这个问题。希望对…

jsp中设置自动换行_办公技巧—Word中如何设置自动生成序号

我们经常会用到Word来编辑文档&#xff0c;经常需要在文档中插入各种序号。如果一个个手动输入这些序列号&#xff0c;会降低我们的工作效率。那么&#xff0c;这种情况下&#xff0c;我们该怎么办呢&#xff1f;今天&#xff0c;小编就教各位Word中设置自动生成序号的小技巧&a…

mongodb如何根据字段(数组类型)的长度排序_大数据存储技术选型(七)——MongoDB设计模式及索引优化...

关系数据库的时代关系数据库的设计理念假设你有一台车&#xff0c;你需要给它存起来&#xff0c;给它找个停车位。传统数据库的存储方式就相当于&#xff0c;把这个车的所有零件拆下来&#xff0c;放在存放对应零件的盒子里&#xff0c;需要用的时候&#xff0c;再把他们取出来…

幼小衔接语言教案上c册_关于幼小衔接,这里有你最想要的解答

相信很多家长都会发现&#xff0c;在孩子即将步入小学的前一年或者半年左右&#xff0c;身边同龄的孩子有一部分会放弃大班的学习&#xff0c;转而去幼小衔接班了。就算平时再佛系的妈妈&#xff0c;内心也会焦虑&#xff0c;产生疑问&#xff1a;到底要不要上幼小衔接班&#…

每日一题20180330-Linux

一、问题 1.1 统计/var/log/下所有文件个数 1.2 查找出/var/log目录下面修改时间是7天以前&#xff0c;大小在50k到2M之间&#xff0c;并以.log结尾的文件把这些文件复制到/data目录中 1.3 设置一条Iptables规则&#xff0c;允许192.168.10.0段访问873端口&#xff1f; 二、答案…

前台文件_欧木瑾怎么定制办公前台?

前台是一个反映公司整体形象的地方。这是给客户和商业伙伴留下印象的第一个地方。因此&#xff0c;芜湖绿木家具有限公司欧木瑾小编说公司的前台装修不能马虎。前台的设计风格与材料的使用有很大关系。从细节上看&#xff0c;这是材料的精美运用。这里是如何设计一个好的前台。…

单纯形法只有两个约束条件_10分钟掌握对偶单纯形法

只听名字的话会感觉对偶单纯形法和对偶问题关系很大&#xff0c;其实不然(想要了解对偶问题的话可以看我之前的文章)。对偶单纯形法在我看来和大M法以及两阶段法很像&#xff0c;都是用来补充纯粹的单纯形法无法解决特殊问题的缺陷。而且对偶单纯形法更加“强大”&#xff0c;因…

linix防火墙设置之顺序设置问题 -- 解决防火墙规则顺序和插入规则到指定序号的问题...

转载于百度经验&#xff1a;https://jingyan.baidu.com/article/ae97a646ce58c2bbfd461d90.html 无论是硬件防火墙还是软件防火墙都会有一个规则序列的问题&#xff0c;规则顺序会影响到规则的生效情况&#xff0c;所以这个必须得注意&#xff0c;下面小编与大家分享一下如何注…

Ubuntu安装完后设置root密码

安装完Ubuntu 14.04后默认是没有主动设置root密码的&#xff0c;也就无法进入根用户。 相关阅读&#xff1a; Ubuntu 14.04 下载、安装、配置 整理汇总 页面 http://www.linuxidc.com/Linux/2014-04/100370.htm Windows 7下硬盘安装Ubuntu 14.04永久更新地址&#xff1a; http:…

js 中转换成list集合_程序员:java集合介绍-List,具说很详细,你不来看看?

Java集合介绍作为一个程序猿&#xff0c;Java集合类可以说是我们在工作中运用最多、最频繁的类。相比于数组(Array)来说&#xff0c;集合类的长度可变&#xff0c;更加方便开发。Java集合就像一个容器&#xff0c;可以存储任何类型的数据&#xff0c;也可以结合泛型来存储具体的…

axure实现搜索功能_vue实现模糊搜索功能

首先写好一个列表写好的样式是这样滴操作来了在computed里面定义了一个search函数 使用filter过滤接下来在method 里面写一个sousuo1函数 进行一个判断 如果搜索这个输入框框里是空 就是展示原数据 如果这个不为空 就会展示搜索到的数据最后 很重要把list改为sousuo1()这个函数…

7000更换控制器电源步骤_开关电源控制环路(初级篇:上)

本文是 21Dianyuan 社区原创技术文章&#xff0c;作者 ctus220&#xff0c;感谢作者的辛苦付出。内容目录&#xff1a;1、环路和直流稳压电源的关系2、与环路相关的基本概念波特图&#xff0c;环路稳定性判据&#xff0c;传递函数&#xff0c;零极点3、常用的补偿控制器PI&…

python实现排列组合公式算法_朴素贝叶斯算法的Python实现

朴素贝叶斯分类算法被广泛应用于文本分类场景中、包含垃圾邮件、互联网新闻等分类任务&#xff0c;属于有监督学习算法。它独立考量每一维度特征被分类的条件概率&#xff0c;然后综合这些概率对其所在的特征向量做出分类预测&#xff0c;即“假设各个维度上的特征被分类的条件…

cdr怎么做文字路径_整理128张图片,告诉你文字少的PPT应该怎么做?

点击上方蓝字关注↑&#xff0c;下次看文更方便&#xff01;微信扫码观看全套Excel、Word、PPT视频作者&#xff1a;自律的音律 来源&#xff1a;自律的音律(ID&#xff1a;yinlvPPT)哈喽&#xff0c;又到周一干货时间。我经常被问到一个问题&#xff0c;PPT 字多的时候&#…

网件rax40可以刷梅林_美国网件发布全系列Wi-Fi6家用无线路由器,部署未来家用产品市场...

5月25日&#xff0c;美国网件在深圳海上世界文化艺术中心发布全线WiFi 6产品&#xff0c;即RAX40、RAX80、RAX120、RAX200四款产品&#xff0c;重新布局WiFi市场&#xff0c;理论速度远远超出大多数家庭互联网连接所能提供的速度。新产品支持下一代Wi-Fi标准——802.11ax&#…

ios 部分string颜色_iOS-代码混淆加固方案

对于iOS来说&#xff0c;由于系统是封闭的&#xff0c;APP上架需要通过App Store&#xff0c;安全性来说相当高。但是对于大厂和知名APP而言&#xff0c;别人给的安全保障永远没有自己做的来得踏实。所以对于大厂、少部分企业级和金融支付类应用来说加固是相当重要的。下面是目…

Python入门基础之迭代和列表生成式

什么是迭代 在Python中&#xff0c;如果给定一个list或tuple&#xff0c;我们可以通过for循环来遍历这个list或tuple&#xff0c;这种遍历我们成为迭代&#xff08;Iteration&#xff09;。 在Python中&#xff0c;迭代是通过 for ... in 来完成的&#xff0c;而很多语言比如C或…

安川最小巧机器人_2020工博会,安川展品前瞻(机器人篇)

&#xff5e;基于YASKAWA(安川)核心产品和i-Mechatronics(i立方-机电一体化)概念&#xff0c;实现客户的生产改革&#xff5e;这次的中国国际工业博览会安川将展出至今为止最多的演示机数量。•提供现在重点关注的智能制造、半导体、汽车制造个性化解决方案•提供适用于所有生产…

如何调度spark程序_如何定时,周期性的运行程序?Python APScheduler实现任务灵活调度...

在我们的开发工作中&#xff0c;时常会有这样的开发需求&#xff0c;如需要定时或者周期性的运行某些程序&#xff0c;因此经常用到一些定时服务&#xff0c;如在 Linux系统中使用 Crond 服务实现程序的定时运行。在 Python中也有这样的一个模块&#xff0c;那就是 APScheduler…