![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
文章平均质量分 74
大胡子的艾娃
业精于勤荒于嬉,行成于思毁于随。
展开
-
并发编程总结
一.进程与线程1.有线程系统:进程是资源分配的独立单位线程是资源调度的独立单位2.对于无线程系统:进程是资源调度、分配的独立单位二.进程之间的的通讯方式及其优缺点1.管道(PIPE)有名管道:一种半双工的通信方式,它允许无亲缘关系进程间的通信无名管道:一种半双工的通信方式,只能在具有亲缘关系的进程间使用(父子进程)1)优点:简单方便,可以实现任意关系的进程间的通信2)缺点:局限于单向通信只能创建在它的进程以及其有亲缘关系的进程之间缓冲区有限长期存于系统中,使用不当容易出错2.原创 2021-08-13 09:07:33 · 197 阅读 · 0 评论 -
基于多进程并发-进程通讯之套接字(socket)
socket:可用于不同设备间的进程通信。原创 2023-02-14 11:28:38 · 454 阅读 · 0 评论 -
基于多进程并发-进程通讯之共享内存(shared memmory)
现代操作系统,对于内存管理,采⽤的是虚拟内存技术,也就是每个进程都有⾃⼰独⽴的虚拟内存空间,不同进程的虚拟内存映射到不同的物理内存中。所以,即使进程A中和进程 B中的虚拟地址是⼀样的,其实访问的是不同的物理内存地址,对于数据的增删查改互不影响。就是拿出⼀块虚拟地址空间来,映射到相同的物理内存中。这样这个进程写⼊的东⻄,另外⼀个进程⻢上就能看到了,都不需要拷⻉来拷⻉去,传来传去,⼤⼤提⾼了进程间通信的速度。(1)共享内存是双向通信(全双工)。(2)共享内存是IPC通信方式中速度最快的。原创 2023-06-24 14:40:43 · 2861 阅读 · 0 评论 -
基于多进程并发-进程同步之互斥锁(Mutex)
所有句柄都被关闭后,操作系统就会删除对象,进程中止前,一定要ReleaseMutex释放互斥体,如未释放,这个互斥体会被标记为废弃,并自动释放所有权。共享这个互斥体的其他应用程序,也许仍然能够用它,但会收到一个废弃状态信息,指出上一个拥有它的进程,未能正常关闭。ReleaseMutex()让调用进程释放对该互斥体的拥有权,此时另一个在等待该mutex的线程,将得到信号停止等待(wait函数)。关闭一个句柄,并将这个句柄的引用计数减一,如果句柄的引用计数减到0,那么操作系统将释放这个核心对象的句柄。原创 2023-06-13 13:58:54 · 1665 阅读 · 0 评论 -
基于多进程并发-进程通讯之管道(pipe)
匿名管道只能用于父子进程间通信 ,不能跨网络通信,并且通信是单向。另外,管道传输的数据是⽆格式的流且⼤⼩受限。正常情况下,控制台进程的输输入出是在控制台窗口的,但是如果我们在创建子进程的时候指定了其输入输出,那么子进程就会从我们的管道读数据,把输出数据写到我们指定的管道。这就是我们代码中重定向标准输入的原因,否则system(“pause”)会无效。命名管道,顾名思义,这个管道肯定是有名字的。通过管道的名字来确保多个进程访问同一个管道。原创 2023-06-24 15:20:20 · 869 阅读 · 0 评论 -
父子进程、进程、线程、协程、芊程
如有错误或不足欢迎评论指出!创作不易,转载请注明出处。原创 2023-06-07 21:07:44 · 214 阅读 · 0 评论 -
基于多进程并发-进程的实现
基于以上几个原因,所以就有了进程间通信的概念,那么进程间通信的原理是什么呢?目前有哪几种进程间通信的机制?他们是如何实现进程间通信的呢?在这篇文章中我会就这几个问题进行详细的讲解。原创 2023-02-13 20:09:16 · 487 阅读 · 0 评论 -
基于多线程并发-线程同步-系统实现
系统实现:相对于STL来说非标准的实现,Linux和Windows平台各自的实现。线程同步:通过限制多个线程同时执行某段代码来保护资源的。原创 2023-06-07 20:23:29 · 586 阅读 · 1 评论 -
基于多线程并发-原子量实现自旋锁
@著作权归作者所有:来自CSDN博客作者大胡子的艾娃的原创作品,如需转载,请注明出处https://blog.csdn.net/qq_43148810,否则将追究法律责任。如有错误的地方欢迎指正,谢谢!一、多线#include <atomic>class spinlock_mutex{ std::atomic_flag flag;public: spinlock_mutex() : flag(ATOMIC_FLAG_INIT) {} void lock() { wh原创 2021-08-10 22:54:24 · 612 阅读 · 0 评论 -
基于多线程并发-STL之多线程进阶-async、future、promise
@著作权归作者所有:来自CSDN博客作者大胡子的艾娃的原创作品,如需转载,请注明出处https://blog.csdn.net/qq_43148810,否则将追究法律责任。如有错误的地方欢迎指正,谢谢!一、async创建异步线程async模板函数的两个版本源码(已去除这里不关注的部分)enum class launch { async = 0x1, deferred = 0x2 };//返回值为std::future类型,?表省略,template<class _Fty,class原创 2021-03-03 02:30:53 · 466 阅读 · 0 评论 -
基于多线程并发-STL之递归锁recursive_mutex
recursive_mutex的用处和mutex差不多,用于限制多线程同时访问同一个变量,用来加锁,保证多个线程,同一时刻只能有一个线程在修改变量;和mutex不同的时,recursive_mutex可以允许同一个线程递归的去加锁,线程只有加锁次数和释放次数相同时,才会释放变量的控制权;例如下面的fun2中调用了fun1,但是fun1和fun2中都加了锁,如果使用mutex,在fun1加锁,在fun2中再次加锁,就会造成死锁;所以recursive_mutex可以避免递归嵌套调用时,造成的死锁问题;原创 2023-05-12 16:51:34 · 277 阅读 · 0 评论 -
基于多线程并发-STL之线程同步-读写锁
多线程之高效的读写锁原创 2021-03-30 00:45:39 · 369 阅读 · 0 评论 -
基于多线程并发-STL之信号量(semaphore)
信号量 (semaphore) 是一种轻量的同步原件,用于制约对共享资源的并发访问。在可以使用两者时,信号量能比条件变量更有效率。如有错误或不足欢迎评论指出!创作不易,转载请注明出处。b、visual studio升级为2019。一、操作系统提供的信号量区别。1、操作系统提供的信号量区别。c、打开c++20支持的开关。二、c++ 20 信号量。原创 2023-05-12 17:32:56 · 762 阅读 · 1 评论 -
基于多线程并发-STL之条件变量condition_variable
1、无线程thread的拷贝、赋值语义2、唤醒所有阻塞等待的线程3、唤醒某一个等待的线程4、阻塞等待的同时释放锁(原子操作)//可添加是否进入或持续阻塞等待判断(函数等)的重载版本 template < class _Predicate > void wait(unique_lock < mutex > & _Lck , _Predicate _Pred) {5、包含超时时间的wait接口wait_for和wait_until。原创 2023-02-01 00:27:14 · 371 阅读 · 0 评论 -
基于多线程并发-STL之线程同步-互斥(mutex)
@著作权归作者所有:来自CSDN博客作者大胡子的艾娃的原创作品,如需转载,请注明出处https://blog.csdn.net/qq_43148810,否则将追究法律责任。如有错误的地方欢迎指正,谢谢!锁的理解:提供了以排他方式防止数据结构被并发修改的方法。一、mutex类mutex类源码class _Mutex_base { // base class for all mutex typespublic: _Mutex_base(int _Flags = 0) noexcept; ~_M原创 2021-02-26 00:13:04 · 895 阅读 · 0 评论 -
基于多线程并发-STL之thread构造函数浅析
@著作权归作者所有:来自CSDN博客作者大胡子的艾娃的原创作品,如需转载,请注明出处https://blog.csdn.net/qq_43148810,否则将追究法律责任。如有错误的地方欢迎指正,谢谢!一、标准库Thread内容(函数内部实现内容已摘去)class thread { // class for observing and managing threadspublic: class id; typedef void *native_handle_type; thread() no原创 2021-02-09 23:14:05 · 1584 阅读 · 0 评论 -
基于多线程并发-STL之thread简介
@著作权归作者所有:来自CSDN博客作者大胡子的艾娃的原创作品,如需转载,请注明出处https://blog.csdn.net/qq_43148810,否则将追究法律责任。如有错误的地方欢迎指正,谢谢!1.创建线程对象1)不代表任何执行线程的对象thread() noexcept;2)fn为可调用对象(函数、仿函数(重载()运算符的类),初始化为"class()")、lame表达式)。args为与之同步的一包参数列表【备注】:类的成员函数作为可调用对象时,第一参数必须是该成员函数的地址,第二参原创 2021-02-10 21:58:26 · 3145 阅读 · 0 评论 -
详解C/C++中volatile关键字
https://blog.csdn.net/weixin_44363885/article/details/92838607原创 2021-08-11 00:03:11 · 560 阅读 · 0 评论 -
基于多线程并发-多线程为什么要加锁
多线程为什么要加锁1、数据竞争(data race)1)多个线程访问其共有的资源(堆、全局变量等),需要加锁(互斥锁、读写锁、递归锁等),否则可能存在寄存器和内存数据不一致。**注意:**堆对象的创建分为分配内存、初始化、指针指向该内存,注意锁的细粒度。2)线程私有资源无需加锁。2、不同线程的子步骤有顺序关联性即线程2中必须等线程1将变量a赋值为1才能对a做除法。注意: 为条件变量(std::condition_variable)的使用场景。2)代码顺序不等同程序执行顺序原创 2023-01-31 23:13:57 · 2064 阅读 · 0 评论