C++并发编程

2023-05-16

C++11多线程:

1、多线程概念

C++11新增了对多线程的支持,提供了<atomic>、<mutex>和<thread>初步支持,但仍不完美。

使用并发的原因:关注点分离和性能。

不适用并发的情况:收益比不上成本,难以理解和维护。

C++98不承认多线程的存在,那就使用POSIX标准线程和Windows 多线程API,这会依赖于平台。

codeblocks中需配置支持C++11的选项才能支持C++11版的多线程。

#include <iostream>
#include <thread>
using namespace std;

void hello()
{
    cout << "Hello Concurrent world\n";
}

int main()
{
    thread t(hello);
    t.join();
}

使用detach会让线程在后台运行,分离线程为守护线程。

向线程函数传递参数。

2、转移线程所有权

 

Boost并发编程:

1、Boost提供的并发编程库非常流行。

thread库需要chrono库提供的时间概念来进行休眠。

互斥量mutex是一种用于线程同步的手段,一旦一个线程锁住了互斥量,那么其他线程必须等待它解锁互斥量后才能再访问共享资源。

互斥量都是boost::noncopyable:

 RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。 
  RAII 的一般做法是这样的:在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处: 

  • 不需要显式地释放资源。 
  • 采用这种方式,对象所需的资源在其生命期内始终保持有效。

 

Linux下C++多线程:

Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linux下pthread的实现是通过系统调用clone()来实现的。clone()是Linux所特有的系统调用,它的使用方式类似fork。

1、线程基本操作

线程创建

  函数原型:int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void),void *restrict arg);

  返回值:若是成功建立线程返回0,否则返回错误的编号。  

   形式参数:pthread_t *restrict tidp 要创建的线程的线程id指针,即,创建成功后,该指针指向的内存存放创建线程的id;const pthread_attr_t *restrict attr创建线程时的线程属性;void* (start_rtn)(void)返回值是void类型的指针函数;void *restrict arg start_rtn的形参。

  ·线程挂起:该函数的作用使得当前线程挂起,等待另一个线程返回才继续执行。也就是说当程序运行到这个地方时,程序会先停止,然后等线程id为thread的这个线程返回,然后程序才会断续执行。

  函数原型:int pthread_join( pthread_t thread, void **value_ptr);

  参数说明如下:thread等待退出线程的线程号;value_ptr退出线程的返回值。

  ·线程退出

  函数原型:void pthread_exit(void *rval_ptr);

  ·获取当前线程id

  函数原型:pthread_t pthread_self(void);

  ·互斥锁

  创建pthread_mutex_init;销毁pthread_mutex_destroy;加锁pthread_mutex_lock;解锁pthread_mutex_unlock。

  ·条件锁

  创建pthread_cond_init;销毁pthread_cond_destroy;触发pthread_cond_signal;广播pthread_cond_broadcast S;等待pthread_cond_wait

2、线程安全

要在多个线程中同时访问同一个shared_ptr,要加mutex保护。

3、线程同步

互斥器mutex:

死锁排查,函数调用栈bt。

条件变量:

不要使用读写锁和信号量:

4、多线程服务器的使用场合

BlockingQueue<T>是多线程编程的利器,

Linux下进程间通信的方式有:匿名或具名管道、POSIX消息队列、共享内存、信号、Socket等,同步原语有互斥量、信号量、条件变量、读写锁、文件锁等。进程间通信首选Socket。

5、I/O复用

Linux下I/O多路复用主要有select、poll和epoll。

select系统调用的用途是:在一段指定时间内监听用户感兴趣的文件描述上的可读、可写和异常等事件。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++并发编程 的相关文章

随机推荐

  • git无法拉取github.com的问题解决

    vim通过git来管理插件 xff0c 从github拉取插件的时候出现以下的问题 xff1a fatal unable to access https github com SirVer ultisnips git Could not r
  • Vim的一些技巧记录

    gf快捷键跳转到对应文档指定的行数 xff1a xff08 在vimrc中添加以下代码段 xff09 span class token keyword function span span class token operator span
  • Systemverilog 文件I/O小结

    一 文件打开和关闭 fopen和fclose操作 xff1a 不同的type含义 xff1a 二 文件内容扫描 从文件中读取内容 xff1a fgetc每次读取一个字符 xff08 8bits xff09 xff1b fgets每次读取一行
  • 如何理解YUV的各种格式

    YUV 是一种彩色编码系统 xff0c 主要用在视频 图形处理流水线中 pipeline 相对于 RGB 颜色空间 xff0c 设计 YUV 的目的就是为了编码 传输的方便 xff0c 减少带宽占用和信息出错 Y UV YUV YCbCr
  • Ubuntu安装Beyond compare提示dpkg 依赖关系问题的解决(附安装及使用技巧)

    1 错误提示 xff1a dpkg 依赖关系问题使得 bcompare i386 的配置工作不能继续 xff1a bcompare i386 依赖于 libxft2 gt gt 2 1 1 dpkg 处理软件包 bcompare i386
  • SQL查询分年龄段、学历查询(结果类似一张表格)

    SELECT CASE WHEN age lt 30 THEN 34 lte29 34 WHEN age BETWEEN 30 AND 40 THEN 34 30 39 34 WHEN age BETWEEN 40 AND 50 THEN
  • Django的初始化

    一 xff0c 安装虚拟环境 python2 pip install virtualenv python3 pip3 install virtualenv 安装Virtualenvwrapper pip install virtualenv
  • ubuntu 出现 core dump 和 segment fault 错误

    在Linux环境下执行程序的时候 xff0c 有的时候会出现段错误 xff08 segment fault xff09 xff0c 同时显示core dumped 就像下面这样 xff1a 1 15428 segmentation faul
  • Linux实现文件定期本地备份/异地备份/删除备份的脚本

    一 背景 1 总会出出现环境上的数据丢失 xff0c 在没有备份的情况下会非常的被动 xff0c 不管是由于病毒还是人为的原因造成的程序 数据被删除 xff0c 有时候后悔已经来不及 xff0c 不如提前做到数据的备份 xff0c 而异地备
  • strace -f strace ls 引发的问题

    strace 是Linux下常用的跟踪程序系统调用的工具 strace简介 可使用 strace lt cmd gt 来跟踪 cmd 所使用的系统调用 xff0c 原理是 strace 进程 fork 一个子进程并使用 ptrace 系统调
  • Ubuntu22.04搭建Pytorch框架深度学习环境+安装Miniconda+安装CUDA与cuDNN

    Linux搭建深度学习环境 以Ubuntu为例 xff0c 从零搭建Pytorch框架深度学习环境 1 Ubuntu安装 1 1 系统下载 访问地址ubuntu官网 1 2 启动盘制作 访问ultraiso官网 1 2 1打开镜像 1 2
  • ARM 立即寻址之立即数的形成 —— 如何判断有效立即数

    依据指令中给出的操作数的不同格式 xff0c ARM 指令系统具有 8 种常见的寻址方式 我们这次就来讨论一下立即寻址 文章目录 立即寻址的特点立即数形式合法立即数立即寻址机器指令格式指令解析判断方法例子 0x0000f200例子 0x23
  • 调用函数返回一个场景renderer并实现多场景在同一窗口显示

    问题 xff1a 函数调用想要返回renderer场景 智能指针类型同样也可以作为函数的返回值 正确的写法类似 xff1a vtkSmartPointerMyFunction vtkSmartPointer myObject 61 vtkS
  • 完美解决Python与anaconda之间的冲突问题,你值得拥有

    anaconda指的是一个开源的Python发行版本 xff0c 其包含了conda Python等180多个科学包及其依赖项 因为包含了大量的科学包 xff0c Anaconda 的下载文件比较大 xff08 约 515 MB xff09
  • win10和linux关闭端口的命令

    win10的相关命令 1 查 xff1a netstat ano findstr 8080 2 杀 xff1a taskkill PID 5616 F 也可以使用netstat ano 查看所有的端口 netstat命令详解 xff1a n
  • nmap

    nmap nmap 简介 xff1a namp也称Network Mapper 是一款多平台的网络连接扫描软件 xff0c 可以探测计算机网络上的主机和服务 在渗透初期为了绘制目标网络拓扑图 xff0c 需要到Nmap对目标网络发送特定的数
  • 日期和时间格式

    时间和日期格式 span class token keyword import span java span class token punctuation span util span class token punctuation sp
  • JDBC优化

    三层架构 JDBC事务 DBUtils 今日内容 1 三层架构 2 三层架构结合事务 3 ThreadLocal解决事务问题 4 DAO通用封装方法 5 DbUtils的使用 ooOoo o8888888o 88 34 34 88
  • 关于x86_64和x32和x86和-386和32位还是64位的区分 指令集的学习

    这里写自定义目录标题 一 xff0c 查到的知识查看linux内核信息查看linux版本信息查看当前的系统位数其他搜索到的信息 指令集和指令集架构的区分 关于x86 64和x32和x86和 386和32位还是64位的区分 一 xff0c 查
  • C++并发编程

    C 43 43 11多线程 xff1a 1 多线程概念 C 43 43 11新增了对多线程的支持 xff0c 提供了 lt atomic gt lt mutex gt 和 lt thread gt 初步支持 xff0c 但仍不完美 使用并发