C++11多线程

1.线程:独立调度的基本单位。进程: 资源分配的基本单位。

2.C++11新标准多线程支持库
< thread > : 提供线程创建及管理的函数或类接口;
< mutex > : 为线程提供获得独占式资源访问能力的互斥算法,保证多个线程对共享资源的同步访问;
< condition_variable > : 允许一定量的线程等待(可以定时)被另一线程唤醒,然后再继续执行;
< future > : 提供了一些工具来获取异步任务(即在单独的线程中启动的函数)的返回值,并捕捉其所抛出的异常;
< atomic > : 为细粒度的原子操作(不能被处理器拆分处理的操作)提供组件,允许无锁并发编程。

3.多线程间通信方式

(1)互斥锁
mutex;
lock_guard (在构造函数里加锁,在析构函数里解锁)
unique_lock 自动加锁、解锁
atomic 基本类型的原子操作
(2)条件变量condition_variable
关于互斥锁和条件变量:
互斥量可以保护共享数据的修改,如果线程正在等待共享数据的某个条件出现,仅用互斥量的话就需要反复对互斥对象锁定解锁,以检查值的变化,这样将频繁查询的效率非常低。
条件变量可以让等待共享数据条件的线程进入休眠,并在条件达成时唤醒等待线程,提供一种更高效的线程同步方式。条件变量一般和互斥锁同时使用,提供一种更高效的线程同步方式。
(3)信号量
(4)读写锁shared_lock

4.进程间的通信方式

(1). 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
(2). 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
(3) 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
(4). 共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
(5). 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
(6)套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
(7) 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。


普通函数多线程调用

//C++11中std命名空间将Boost库中的Thread加入
//Boost的多线程从准标准变为标准,在深度学习以及应用程序开发中经常用到多线程
#include<thread>
#include<iostream>
#include<mutex>
using namespace std;
void helloThread()
{cout<<"hello Thread"<<endl;
} 
int sum(int a,int b){int c=a+b;cout<<a<<'+'<<b<<'='<<c<<endl;return c;
} 
int main(){//thread t1(helloThread);thread t1(sum,1,2);//子线程运行结束后可执行下一步 t1.join();//主线程代码 cout<<"main here"<<endl;getchar();return 0;
}

在类内部创建线程


#include<thread>
#include<iostream>
#include<mutex>
using namespace std;
//start()和hellothread()方法都必须是static方法
class helloThread{public:static void hellothread(){cout<<"hello I am a thread"<<endl;}static void start(){thread t1(hellothread);t1.join();}
};
int main(){helloThread::start();getchar();return 0;
}

在Singleton模式内部创建线程.

#include<thread>
#include<iostream>
#include<mutex>
using namespace std;
//在Singleton模式内部创建线程.
class helloWorld{public:void hello(){cout<<"hello I am a thread"<<endl;}static void start(){thread t1(bind(&helloWorld::hello,&helloWorld::getInstance()));t1.join();}static helloWorld& getInstance(){if(!instance) instance=new helloWorld;return *instance; }private:helloWorld(){	};static helloWorld *instance;	
};
helloWorld* helloWorld::instance=0;
int main(int argc,char *argv[]){helloWorld::start();getchar();return 0;
}

用类内部函数在类外部创建线程

#include<thread>
#include<iostream>
#include<mutex>
using namespace std;
//用多线程调用其内部的函数
class helloWorld{public:void hello(int year){cout<<"I am "<<year<<" years old"<<endl;}}; 
int main(int argc,char *argv[]){helloWorld obj;thread t1(bind(&helloWorld::hello,&obj,23));t1.join();//join()的作用,主线程等待子线程结束方可执行下一步(串行)//join()函数是一个等待线程完成函数,主线程需要等待子线程运行结束了才可以结束//注意不是才可以运行,运行是并行的getchar();return 0;
}

detach()

#include<thread>
#include<iostream>
#include<mutex>
using namespace std;
//detach()子线程独立于主线程并发执行,主线程后续代码段无需等待
//detach()函数是子线程的分离函数,当调用该函数后,线程就被分离到后台运行,
主线程不需要等待该线程结束才结束
void helloThread(){	cout<<"hello thread"<<endl;	 cout<<endl;
}
int g_sum(int a,int b){int c=a+b;cout<<a<<'+'<<b<<'='<<c<<endl;return c;
}
int main(int argc,char *argv[]){thread t1(helloThread);thread t2(g_sum,2,3);t1.detach();t2.detach();cout<<"main here"<<endl;getchar();return 0;
}

数据同步(线程同时操作一个数据的安全性)

#include<thread>
#include<iostream>
#include<mutex>
using namespace std;
mutex mt;
int data=1;
void addMethod(int a){mt.lock();data+=a;cout<<"add data= "<<data<<endl;mt.unlock();
}
void multi(int a){mt.lock();data *=a;cout<<"multi data= "<<data<<endl;mt.unlock();
}
int main(int argc,char *argv[]){thread t1(addMethod,2);//3thread t2(multi,10);//30t1.detach();t2.detach();getchar();return 0;
}

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

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

相关文章

11、监测数据采集物联网应用开发步骤(8.2)

监测数据采集物联网应用开发步骤(8.1) 新建TCP/IP Client线程类com.zxy.tcp.ClientThread.py #! python3 # -*- coding: utf-8 -Created on 2017年05月10日 author: zxyong 13738196011 import datetime import socket import threading import timefrom com.zxy.adminlog.Us…

关于flutter中 initState() 与 setState() 用法

initState()函数是在组件渲染之前执行的。在Flutter中&#xff0c;initState()是StatefulWidget的生命周期方法之一&#xff0c;在调用build()方法之前被调用。当创建一个StatefulWidget并将其添加到组件树中时&#xff0c;Flutter会实例化该组件的状态对象&#xff0c;并在调用…

防破解方法:文字提示信息都经过编码加密处理

本篇文章属于《518抽奖软件开发日志》系列文章的一部分。 我在开发《518抽奖软件》&#xff08;www.518cj.net&#xff09;的时候&#xff0c;为了防止被破解&#xff0c;需用添加一些暗桩等&#xff0c;需要提示用户不要用盗版。破解者会根据提示信息找到暗桩的位置&#xff0…

深度学习-4-二维目标检测-YOLOv3模型

单阶段目标检测模型YOLOv3 R-CNN系列算法需要先产生候选区域&#xff0c;再对候选区域做分类和位置坐标的预测&#xff0c;这类算法被称为两阶段目标检测算法。近几年&#xff0c;很多研究人员相继提出一系列单阶段的检测算法&#xff0c;只需要一个网络即可同时产生候选区域并…

Linux:编译遇到 Please port gnulib freadahead.c to your platform ,怎么破

问题背景 编译m4时遇到以下错误&#xff0c;该怎么解决呢&#xff1f; 解决方法 进入m4的build目录&#xff1a;build/host-m4-1.4.17 输入命令&#xff1a; sed -i s/IO_ftrylockfile/IO_EOF_SEEN/ lib/*.c echo "#define _IO_IN_BACKUP 0x100" >> lib/std…

堆栈深度超过限制

报错&#xff1a;Cause: com.kingbase8.util.KSQLException: 错误: 堆栈深度超过限制 Hint: 在确定了平台的堆栈深度限制是足够大后&#xff0c;增加配置参数 "max_stack_depth"的值(当前值为2048kB).; 错误: 堆栈深度超过限制 Hint: 在确定了平台的堆栈深度限制是足…

机器学习和数据挖掘03-模型性能评估指标

Accuracy&#xff08;准确率&#xff09; 概念&#xff1a;模型正确预测的样本数量与总样本数量的比例。 公式&#xff1a;Accuracy (TP TN) / (TP TN FP FN) TP (True Positives)&#xff1a;正确预测为正例的样本数。即模型正确地将正例判定为正例。 TN (True Negati…

go中runtime包里面的mutex是什么?runtime.mutex解析

其实在看go源码的时候&#xff0c;发现除了sync包里有个mutex以外&#xff0c;runtime包里也有一个mutex&#xff0c;这个mutex在runtime很多地方都在用。 这个runtime包里面的mutex的结构如下&#xff1a; 目录: /runtime/runtime2.go 代码&#xff1a; type mutex struct …

PYTHON用户流失数据挖掘:建立逻辑回归、XGBOOST、随机森林、决策树、支持向量机、朴素贝叶斯和KMEANS聚类用户画像...

原文链接&#xff1a;http://tecdat.cn/?p24346 在今天产品高度同质化的品牌营销阶段&#xff0c;企业与企业之间的竞争集中地体现在对客户的争夺上&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 “用户就是上帝”促使众多的企业不惜代价去争夺尽可能多的客…

常用的 hooks 函数

React 的 Hooks 为函数组件引入了之前只能在类组件中使用的功能和生命周期特性。以下是一些常用的 Hooks&#xff1a; 1. useState: 允许函数组件有内部状态。返回一个状态变量和一个设置该状态的函数。 const [count, setCount] useState(0);2. useEffect: 用于执行副作用…

OpenCV(四):Mat支持的运算

目录 1.对两个 Mat 对象按元素进行运算&#xff0c;有加法、减法、乘法和除法等运算。 2.Mat类支持逻辑与、或、非等逻辑运算&#xff0c; 1.对两个 Mat 对象按元素进行运算&#xff0c;有加法、减法、乘法和除法等运算。 加法&#xff1a;Mat Mat&#xff0c;保存到 resul…

【1】openGL glew示例代码分析绘制一个三角形

openGL文档 > docs.gl &#xff0c;可以直接查询函数的定义和使用 #include <iostream> #include <string> #include <GL/glew.h> #include <GLFW/glfw3.h>int main(void) {GLFWwindow* window;/* Initialize the library */if (!glfwInit())retu…

LeetCode_SQL练习(二)

196. 删除重复的电子邮箱 表: Person ---------------------- | Column Name | Type | ---------------------- | id | int | | email | varchar | ----------------------id 是该表的主键列(具有唯一值的列)。 该表的每一行包含一封电子邮件。电子邮件…

vue去掉循环数组中的最后一组的某个样式style/class

vue去掉循环数组中的最后一组的某个样式style/class 需求&#xff1a;要实现这样的排列 现状 发现&#xff0c;最后一个格子并没有跟下面绿色线对齐。 最后发现 是因为 每个格子都给了 margin-right&#xff1a;36px&#xff0c;影响到了最后一个格子 所以要 将最后一个格子的…

Linux:Jupyterhub多用户远程登录安装、使用经验

1、安装 首先&#xff0c;打开官网帮助文档&#xff1a; JupyterHub 官方安装帮助文档 一般安装都是参考官方最新版安装文档。 1.1环境条件 本次安装 JupyterHub的软件环境&#xff1a; 基于 Linux Centos系统&#xff1b;Python 3.9或更高版本&#xff1b;安装 nodejs/n…

CMake rv1109交叉编译环境搭建

安装vmware虚拟机 准备安装包VMware-workstation-full-15.5.1-15018445.exe 下载地址安装 参考资料 在vmware上安装Linux环境 准备安装包ubuntu-18.04.4-desktop-amd64.iso 下载地址安装 参考资料 安装rv1109交叉编译工具链 准备安装包rv1109_toolchain_release.tar.bz2 下…

【深度学习】实验05 构造神经网络示例

文章目录 构造神经网络1. 导入相关库2. 定义一个层3. 构造数据集4. 定义基本模型5. 变量初始化6. 开始训练 构造神经网络 注明&#xff1a;该代码用来训练一个神经网络&#xff0c;网络拟合y x^2-0.5noise&#xff0c;该神经网络的结构是输入层为一个神经元&#xff0c;隐藏层…

高效利用隧道代理实现无阻塞数据采集

在当今信息时代&#xff0c;大量的有价值数据分散于各个网站和平台。然而&#xff0c;许多网站对爬虫程序进行限制或封禁&#xff0c;使得传统方式下的数据采集变得困难重重。本文将向您介绍如何通过使用隧道代理来解决这一问题&#xff0c;并帮助您成为一名高效、顺畅的数据采…

工厂人员作业行为动作识别检测算法

工厂人员作业行为动作识别检测算法通过yolov7python深度学习算法框架模型&#xff0c;工厂人员作业行为动作识别检测算法实时识别并分析现场人员操作动作行为是否符合SOP安全规范流程作业标准&#xff0c;如果不符合则立即抓拍告警提醒。Python是一种由Guido van Rossum开发的通…

【React】React学习:从初级到高级(一)

React学习[一] 1 UI描述1.1 组件的创建与使用1.1.1 创建组件1.1.2 使用组件 1.2 组件的导入与导出1.2.1 根组件文件1.2.2 导出和导入一个组件1.2.3 从同一文件中导出和导入多个组件 1.3 使用JSX书写标签语言1.3.1 JSX:将标签引入JavaScript1.3.2 将HTML转换为JSX1.3.3 高级提示…