c++11并发与多线程
文章平均质量分 79
关于多线程并发学习过程中的知识笔记和总结
aFakeProgramer
Adaptive AUTOSAR的技术专家,AUTOSAR中国官方培训讲师,具备深厚的汽车行业知识和以太网通信技能。SOME/IP、IPC、DDS、DoIP、UDS、TSN和SOA架构,MQTT,加密,操作系统,v2x,以及c++和Python编程语言。改写成个人简介
展开
-
c++11新特性之线程相关所有知识点
c++11关于异步操作提供了future相关的类,主要有std::future、std::promise和std::packaged_task,std::future比std::thread高级些,std::future作为异步结果的传输通道,通过get()可以很方便的获取线程函数的返回值,std::promise用来包装一个值,将数据和future绑定起来,而std::packaged_task则用来包装一个调用对象,将函数和future绑定起来,方便异步调用。转载 2024-02-27 15:00:39 · 56 阅读 · 0 评论 -
c++如何使用volatile关键字保证线程安全?explicit
(1) C/C++ 中 volatile 关键字详解 | 菜鸟教程. https://www.runoob.com/w3cnote/c-volatile-keyword.html.(4) C/C++ 中 volatile 关键字详解 | 菜鸟教程. https://www.runoob.com/w3cnote/c-volatile-keyword.html.(2) C/C++ 中的 volatile - 知乎. https://zhuanlan.zhihu.com/p/62060524.原创 2024-01-30 11:23:40 · 1187 阅读 · 0 评论 -
什么是线程安全,你了解吗?
非线程安全的对象或方法通常需要额外的同步措施来保证正确的结果。例如,StringBuilder类是非线程安全的,因为它是可变的,它的状态可能会被多个线程修改。例如,String类是线程安全的,因为它是不可变的,它的状态不会被多个线程修改。(10) 线程安全 - 维基百科,自由的百科全书. https://zh.wikipedia.org/wiki/%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8.例如,银行转账操作应该是原子的,要么转账成功,要么转账失败,不会出现转账一半的情况²。原创 2024-01-30 11:02:01 · 654 阅读 · 0 评论 -
error: use of deleted function ‘std::atomic<int>::atomic(const std::atomic<int>&) 防止原子类型被意外复制
编译错误是因为你使用了被删除的拷贝构造函数`std::atomic::atomic(const std::atomic&)`,它用来防止原子类型被意外复制。`,它们不会调用拷贝构造函数,而是调用其他的构造函数,如`constexpr atomic(__integral_type __i) noexcept`。这样就可以解决你的错误,让你的程序正常编译和运行。这就会调用被删除的拷贝构造函数,导致错误。上面代码中,你使用了拷贝初始化的语法`可以使用直接初始化的语法``或者列表初始化的语法`原创 2024-01-26 14:28:46 · 1099 阅读 · 0 评论 -
无锁编程最大的优势是什么?
我写的C++期货高频交易软件中,有一个全局变量fund,存储的是当前资金量,程序采用线程池运行交易策略,交易策略中频繁使用到fund变量,如果采用加锁的方式,使用起来极其繁琐,为了保护一个fund变量需要非常频繁的加锁解锁,后来将fund变量改为原子类型,后面使用就不用再考虑加锁问题,整个程序阅读起来清晰很多。如果是为了提高性能将程序大幅改写成无锁编程,一般来说结果可能会让我们失望,而且无锁编程里面需要注意的地方也非常多,比如ABA问题,内存顺序问题,原创 2024-01-26 14:02:51 · 653 阅读 · 0 评论 -
C++ 构造函数不能声明为虚函数的原因
假设函数调用使用虚机制,它将仅仅产生通过它自己的VTABLE的调用,而不是最后的VTABLE(全部构造函数被调用后才会有最后的VTABLE)。并且,仅仅要它是最后的构造函数调用,那么在这个对象的生命期内,VPTR将保持被初始化为指向这个VTABLE, 但假设接着另一个更晚派生的构造函数被调用,这个构造函数又将设置VPTR指向它的 VTABLE,等.直到最后的构造函数结束。相应一个指向vtable虚函数表的指针,这大家都知道,但是这个指向vtable的指针事实上是存储在对象的内存空间的。原创 2023-09-16 20:18:51 · 376 阅读 · 0 评论 -
C++ 并行编程(thread)---多线程
C++ 并行编程(thread)---多线程_c++ thread process_泠山的博客-CSDN博客进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位。线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。是程序执行的最小单位。转载 2023-09-13 14:27:15 · 361 阅读 · 0 评论 -
void指针
void指针为无类型指针,可以指向任何类型数据。原创 2023-09-01 17:26:58 · 281 阅读 · 0 评论 -
std::atomic 原子操作
这种操作一旦开始,就一直运行到结束,中间不会有任何任何上下文切换。转载 2023-04-04 14:02:32 · 201 阅读 · 0 评论 -
Linux 进程间通信(六)共享内存
可以说, 共享内存是一种最为高效的进程间通信方式, 因为进程可以直接读写内存, 不需要任何数据的复制。 为了在多个进程间交换信息, 内核专门留出了一块内存区, 这段内存区可以由需要访问的进程将其映射到自己的私有地址空间。 因此, 进程就可以直接读写这一内存区而不需要进行数据的复制, 从而大大提高了效率。 当然, 由于多个进程共享一段内存,因此也需要依靠某种同步机制, 如互斥锁和信号量等(请参考 4.7.2 节)。其原理示意图如图4.7 所示。先参考这个博客:共享内存的实现分为两个步骤:第一步是创建共享内存转载 2023-01-10 10:50:34 · 168 阅读 · 0 评论 -
linux父子进程问题——孤儿进程与僵尸进程[总结]
今天遇到一个linux进程启动时指定Max open files不对的问题,导致程序建立socket异常,进而导致fullgc问题,影响正常服务。所以顺带又温习了下linux下的父子进程的特性。孤儿进程与僵尸进程[总结]1、前言 之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上面,没有深入,倍感惭愧。晚上回来google了一下,再次参考APUE,认真总结一下,加转载 2021-11-19 14:38:17 · 1033 阅读 · 0 评论 -
五万字读懂c++
底层实现原理与编译器相关,一般通过虚基类指针和虚基类表实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,虚基类依旧会在子类里面存在拷贝,只是仅仅最多存在一份而已,并不是不在子类里面了);类里如果声明了虚函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖(override),这样的话,编译器就可以使用后期绑定来达到多态了。纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。转载 2022-03-01 14:42:02 · 1583 阅读 · 0 评论 -
[C++11 并发编程] 17 超时等待 - clock和duration
之前我们看到的所有等待机制都是不会超时的,也就是说,等待某个同步事件的线程会一直挂起。有些情况下,我们希望设置一个最长等待时间,使得程序可以继续与用户进行交互,使得用户可以取消这个操作。我们先来看看C++11提供的时钟类clock:clockclock提供了如下四种信息: 当前时间 存放从clock获取到的时间的类型 时钟每个tick的周期 每个tick的周期是否固定,固定则为“steady”时钟Member functionsnow [static]...翻译 2022-02-18 16:43:54 · 1607 阅读 · 0 评论 -
[C++11 并发编程] 动态选择并发线程的数量
C++标准模板库提供了一个辅助函数 - std::thread::hardware_concurrency(),通过这个函数,我们可以获取应用程序可以真正并发执行的线程数量。下面这个例子,实现了一个并发版本的std::accumulate,它将工作拆分到多个线程中,为了避免过多线程带来的开销,程序指定了每个线程处理数据的最小数量。头文件和求和操作:sum.hpp#include <thread>#include <numeric>#include <algo转载 2022-02-18 16:35:21 · 435 阅读 · 0 评论 -
C++并发编程 unique_lock and condition_variable
在t1线程中插入值,在t2线程中取出值。#include <iostream>#include <thread>#include <vector>#include <string>#include <mutex>#include <deque>using namespace std;std::deque<int> q;mutex mu;void fun2(){ int count =1.原创 2022-02-16 17:05:40 · 409 阅读 · 0 评论 -
C++ thread::hardware_concurrency 获取硬件支持并发数
一、功能获取硬件支持的并发线程数二、返回值正常返回支持的并发线程数,若值非良定义或不可计算,则返回 0四、示例#include <iostream>#include <thread>int main(){ unsigned int in = std::thread::hardware_concurrency(); std::cout << in << std::endl;}...原创 2022-02-16 13:03:00 · 3021 阅读 · 0 评论 -
C++关键字之Future promise and async()
主线程将x传递给子线程,子线程将结果x再传递给主线程。#include <iostream>#include <future>#include <thread>using namespace std;void myfun(int N,int& x){ int res =1; for(int i=N;i>1;i--) { res *= i; } cout<<"Result r原创 2022-02-15 14:57:30 · 291 阅读 · 0 评论 -
C++ 之父的多线程编程建议——现代 C++ 对多线程/并发的支持(下)
本文承接前文 现代 C++ 对多线程/并发的支持(上),翻译自 C++ 之父 Bjarne Stroustrup 的 C++ 之旅(A Tour of C++)一书的第 13 章 Concurrency。本文将继续介绍 C++ 并发中的 future/promise,packaged_task 以及 async() 的用法。目录13.7 通信任务 13.7.1 future 和 promise 13.7.2 packaged_task 13.7.3 async() 13.8 建转载 2022-02-15 11:41:15 · 199 阅读 · 0 评论 -
多核处理器的关键技术
英特尔的cpu是从前代gt-atom一路供货到第7代,想必日常使用不会有太大区别,而在系统之外可能存在一些散热方面的问题。而上市越早的处理器,硬件供货越好,可能在某些特殊时间段会出现不足,从而导致售后问题。据说m6s的官方一个批次仅支持至强e3v3,和2600x不兼容。已经更新4代,性能也很接近2600x,ipc设定20左右。如果2600x和2600x对比应该是同频cpu,但同样的双核a10和a8a9/a12性能其实差不多,三级缓存多得多,能用上两倍的一些性能。而且2600x工艺提升了很多。2600x比26转载 2021-12-31 10:46:22 · 980 阅读 · 0 评论 -
进程与线程
进程与线程对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个 Word 就启动了一个 Word 进程。有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。类比:进程 = 工厂线程 = 工厂里各个流水线注意:一个转载 2021-12-13 13:49:40 · 337 阅读 · 0 评论 -
i++在两个线程执行100次,最终的结果是
i++语句只需要执行一条指令但当有多个线程时,并不能保证多个线程i++,操作同一个i。因为还有寄存器的因素,多个cpu对应多个寄存器。每次要先把i从内存复制到寄存器,然后++,然后再把i复制到内存中,这需要至少3步。如此,假设两个线程的执行步骤如下:i++在两个线程中执行100次的时候,由于,对于多线程,线程共用一个内存,如果线程A在寄存器中执行了加一操作而没有写入内存,那么将会切入到另一个线程进行加一操作,在进程来回转换的过程中很可能导致原来内存中的值被覆盖,因此,此段代码执行的结果为:原创 2021-01-14 10:56:49 · 3334 阅读 · 1 评论 -
进程调度,一个调度器的自白
进程调度,一个调度器的自白我是一个进程调度器。我的职责是调度计算机内所有的进程,为他们分配 CPU 资源。1、批处理时代想当初,操作系统创造我时,只是打算让我用FCFS调度算法,简单维护下进程的秩序。但我后来的发展,远远超过了他的想象。1.1 FCFS所谓 FCFS 就是「先来先服务(First Come First Serve)」,每个进程按进入内存的时间先后排成一队。每当 CPU 上的进程运行完毕或者阻塞,我就会选择队伍最前面的进程,带着他前往 CPU 执行。就拿这几个进..转载 2020-07-13 11:22:29 · 180 阅读 · 0 评论 -
无锁编程基础
背景我们处在技术快速发展的时代,竞争变得前所未有的激烈,不仅要十八般武艺俱全,还得选对正确的技术,跟上发展的脚步,并贴上精研某个专业方向的标签。我们不仅要面对多线程和并发,还要考虑多核时代的并行计算,无锁编程或许是一种选择,可能会提升性能,也可能避免锁的使用引起的错误,同时会带来编程习惯的变革。不可否认,无锁技术是目前各种并发解决方案中比较受争议的一种,尽管它基于最基本的编程技术,不依赖于任何语言和平台,但是这项技术有些诡异,掌握起来颇有难度,有点曲高和寡,所以没有大面积应用在编程中。技术本身转载 2020-07-07 20:16:41 · 545 阅读 · 0 评论 -
C++之future和promise
C++之future和promisefuture和promise的作用是在不同线程之间传递数据。使用指针也可以完成数据的传递,但是指针非常危险,因为互斥量不能阻止指针的访问;而且指针的方式传递的数据是固定的,如果更改数据类型,那么还需要更改有关的接口,比较麻烦;promise支持泛型的操作,更加方便编程处理。在并发编程中,会使用各种回调方法来处理异步返回的结果,如果使用不慎将会让代码分散且难以维护,这里我也是踩了不少坑。既然有坑,就一定有解决办法,C++11的future提供了很好的解决方案,让代码原创 2020-07-06 10:17:15 · 2812 阅读 · 0 评论 -
什么是进程?什么是线程?总结
1.什么是进程?什么是线程?进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。因转载 2020-07-01 21:35:26 · 725 阅读 · 0 评论 -
C++11 并发指南一(C++11 多线程初探)
相信 Linux 程序员都用过 Pthread, 但有了 C++11 的 std::thread 以后,你可以在语言层面编写多线程程序了,直接的好处就是多线程程序的可移植性得到了很大的提高,所以作为一名 C++ 程序员,熟悉 C++11 的多线程编程方式还是很有益处的。如果你对 C++11 不太熟悉,建议先看看维基百科上关于 C++11 新特性的介绍,中文C++11介绍,英文C++11介绍,另外C++之父Bjarne Stroustrup的关于C++11 的 FAQ也是必看的,我也收集了一些关...转载 2020-06-10 16:51:49 · 263 阅读 · 0 评论 -
Print in Order 解题报告(C++)
我们提供了一个类:public class Foo {public void one() { print("one"); }public void two() { print("two"); }public void three() { print("three"); }}三个不同的线程将会共用一个Foo实例。线程 A 将会调用 one() 方法线程 B 将会调用two() 方法线程 C 将会调用 three() 方法请设计修改程序,以确保 two() 方法在 on...转载 2020-05-25 11:02:08 · 282 阅读 · 0 评论 -
分布式、高并发、多线程,到底有什么区别?
分布式、高并发、多线程,到底有什么区别?当提起这三个词的时候,是不是很多人都认为分布式=高并发=多线程?当面试官问到高并发系统可以采用哪些手段来解决,或者被问到分布式系统如何解决一致性的问题,是不是一脸懵逼?确实,在一开始接触的时候,不少人都会将三者混淆,误以为所谓的分布式高并发的系统就是能同时供海量用户访问,而采用多线程手段不就是可以提供系统的并发能力吗?实际上,他们三个总是相伴而生,但侧重点又有不同。1什么是分布式?分布式更多的一个概念,是为了解决单个物理服务器容量和性...转载 2020-05-12 08:25:07 · 261 阅读 · 0 评论 -
C++知识点小结(趁热搬砖三年半的小码农) 2020年06月30日整理
这个博客写的很好:https://blog.csdn.net/u012864854/article/details/79777991很牛的一个C++小结https://www.cnblogs.com/liufei1983/p/7099401.html100条经典C++语言笔试题目-前50题https://blog.csdn.net/sinat_20265495/article/...原创 2019-06-17 15:20:31 · 1810 阅读 · 0 评论 -
锁的概念(互斥锁、读写锁、条件锁、自旋锁、)
一点睛先看看互斥锁,它只有两个状态,要么是加锁状态,要么是不加锁状态。假如现在一个线程a只是想读一个共享变量 i,因为不确定是否会有线程去写它,所以我们还是要对它进行加锁。但是这时又有一个线程b试图去读共享变量 i,发现被锁定了,那么b不得不等到a释放了锁后才能获得锁并读取 i 的值,但是两个读取操作即使是同时发生的,也并不会像写操作那样造成竞争,因为它们不修改变量的值。所以我们期望在多个线...转载 2020-04-02 10:36:59 · 2731 阅读 · 1 评论 -
c++11多线程 windows临界区、其他各种mutex互斥量 第十二讲
(1)windows临界区(2)多次进入临界区实验(3)自动析构技术(4)recursive_mutex递归的独占互斥量(5)带超时的互斥量std::timed_mutex和std::recursive_timed_mutex#include <thread>#include <windows.h>#define __WINDOWS__class A{...原创 2020-02-22 18:47:15 · 336 阅读 · 0 评论 -
c++11多线程 async、future、packaged_task、promise 第九讲
(1)std::async、std::future创建后台任务并返回(2)std::packaged_task(3)std::promise(4)小结一、std::async、std::future创建后台任务并返回希望线程返回一个结果;std::async是一个函数模板,用来启动一个异步任务,启动起来一个异步任务后,他返回一个std::future对象,std::future是一...原创 2020-02-22 18:14:04 · 301 阅读 · 0 评论 -
c++11多线程编程 condition_variable wait notify_one notify_all 第八讲
(1)条件变量std::condition_variable、wait() 、notify_one()、notify_all()wait()用来等一个东西 //如果第二个参数返回值是true,那么这一行就继续往下运行。 //如果第二个参数返回值是false那么wait将解锁互斥量,并堵塞在这一行 //堵到什么时候呢?...原创 2020-02-22 10:02:09 · 1262 阅读 · 0 评论 -
Linux ipcs命令与ipcrm命令的用法详解
ipcs命令是用于显示系统中当前存在的进程间通信(IPC)资源信息的工具。如果一个IPC资源不再被需要或者由于某些原因出现问题,我们可以使用ipcrm命令将其从系统中删除,释放相关的资源。以下是对Linux中的ipcs命令与ipcrm命令的用法进行了介绍,需要的朋友可以过来参考下。ipcs -u 输出当前系统下ipc各种方式的状态信息(共享内存,消息队列,信号)ipcs -a 是默认的输出信息 打印出当前系统中所有的进程间通信方式的信息。ipcs -c 输出ipc各种方式的在该系统下的限制条件信息。转载 2020-02-19 12:10:37 · 548 阅读 · 1 评论 -
linux进程间通信-共享内存
linux进程间通信-共享内存一共享内存介绍共享内存可以从字面上去理解,就把一片逻辑内存共享出来,让不同的进程去访问它,修改它。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内...转载 2020-02-18 14:28:59 · 231 阅读 · 0 评论 -
进程间通信———共享内存的原理
下图是两个进程间使用共享内存通信的示意图:进程A和进程B在操作系统os中都有自己的虚拟内存空间这个虚拟内存空间又各自对应磁盘上的一段物理内存空间,而且它们是各自独立没有交集的。1、调用API,让操作系统在物理内存中开辟一大段缓存空间(就是笔在的那个空间)2、进程A和进程B各自让进程空间与开辟出的实际物理缓存空间建立一一对应的映射关系3、两个进程各自操作自己的虚拟内存来...原创 2020-02-18 12:26:20 · 2296 阅读 · 1 评论 -
c++11多线程编程
https://blog.csdn.net/weixin_36049506/article/details/93333549文章目录线程管理创建/启动一个新线程无参线程有参线程等待和分离线程转移线程所有权运行时决定线程数量识别线程线程间共享数据/变量invariants and race condition使用互斥量保护共享数据死锁及其解决方案互斥量所有权传递锁的粒...转载 2019-12-25 17:01:30 · 236 阅读 · 0 评论 -
用类对象(可调用对象)创建线程的手法(学习)
其他创建线程的手法:用类对象(可调用对象),就会执行operator这个函数。这样的程序每次执行结果都不一样。//线程中使用了主线程的局不变量,主线程执行结束后,i内存被回收。子线程还在使用i的引用,会出现不可知的情况。一旦调用detach(),主线程的TA对象还在吗?答:这个对象不在了,但是没有关系,因为这个对象是被复制到了子线程中去。执行完主线程ta会被销毁,但是复制的对象依旧存...原创 2019-12-23 20:48:25 · 521 阅读 · 0 评论 -
joinable():判断是否可以成功使用join()或者detach()学习笔记
joinable():判断是否可以成功使用join()或者detach(),返回true表示可以使用join()或者detach()返回fasle表示不可以void fun_th(){ cout<<"线程执行"<<endl;}thread myth(fun_th);if(myth.joinable()){ cout<&l...原创 2019-12-23 20:47:34 · 1194 阅读 · 0 评论 -
linux下socket实现多个客户端向一个服务器端连续发送消息,服务器端使用MQTT转发消息
左边同时启动了5个客户端,右边上面是server收界面client消息,右下方是mqtt subscruib 窗口。本文的实现参考了几篇很不错的博客,下面列出给大家参考:这是一个聊天室程序,实现多个客户端向一个服务端发送消息,服务端输入消息,可以向所有连接上的客户端广播。linux下socket编程实现一个服务器连接多个客户端https://blog.csdn.net/z...原创 2019-11-23 15:28:56 · 2694 阅读 · 1 评论