![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux并发与竞争
文章平均质量分 83
Embedded-Xin
沪漂-嵌入式软件开发工程师
正在逐步把之前的笔记整理到博客上,做到稳定的输入与输出!
展开
-
IO复用技术(1)——select/poll/epoll原理介绍及使用案例
IO复用中epoll会更高效,内存拷贝次数少,事件复杂度低,且不受fd数量的限制。原创 2024-05-04 21:41:42 · 968 阅读 · 1 评论 -
Linux多进程通信总结——进程间通信看这一篇足够啦!
五种进程间通信汇总,必看!原创 2024-04-04 11:15:33 · 388 阅读 · 0 评论 -
Linux多进程通信(4)——消息队列从入门到实战!
1)获取消息队列键值pathname:路径名,是必须存在的,ftok只是根据文件inode在系统内的唯一性来取一个数值,和文件的权限无关。proj:1-255之间的数字返回值: 生成一个独有的数,失败则返回-1key 31-24 proj_id 低8位key 23-16 pathname的st_dev属性的低8位key 15-0 pathname的st_ino属性的低16位32位组合而成一个int值,就是我们的ftok的返回值了根据路径名以及数字,合成系统中唯一的Key值。原创 2024-04-04 11:09:40 · 1356 阅读 · 0 评论 -
Linux多进程通信(3)——详细说说共享内存原理及使用例程
共享内存的原理便是将相同的一片物理内存映射到进程A和进程B不同的逻辑地址空间,两个进程同时访问这块物理内存(共享内存)。共享内存是进程间通信访问速度最快。例如消息队列,FIFO,管道的消息传递方式一般为1:服务器得到输入2:通过管道,消息队列写入数据,通常需要从进程拷贝到内核。3:客户从内核拷贝到进程4:然后再从进程中拷贝到输出文件上述过程通常要经过4次拷贝,才能完成文件的传递。而1:从输入文件到共享内存区2:从共享内存区输出到文件上述过程。原创 2024-04-01 22:31:40 · 1623 阅读 · 0 评论 -
Linux多进程通信(2)——POSIX信号量使用例程
1),而POSIX信号量分为有名信号量和无名信号量,而System V标准的信号量并不是,Posix通过sem_open单一的调用就完成了信号量的创建、初始化和权限的设置,而System V要两步。POSIX无名信号量,POSIX信号量,用能看到,而System V信号量,则是使用查看。:可以在多进程间使用,多进程通过名字来打开同一个信号量,使用范围更广:一般在多线程使用,因为没有名字,所以没法在多进程中打开同一个信号量。原创 2024-04-01 22:29:51 · 803 阅读 · 0 评论 -
Linux多进程通信(1)——无名管道及有名管道使用例程
管道是半双工通信,如果需要 双向通信,则需要建立两个管道,:只能父子进程间通信,且是非永久性管道通信结构,当它访问的进程全部终止时,管道也随之被撤销:进程间不需要有亲缘关系,是永久性管道通信结构,直到pclose才被关闭。(提供了一个路径名,以FIFO的形式存在于文件系统)原创 2024-04-01 00:54:03 · 599 阅读 · 2 评论 -
Linux多线程(2)-线程间同步的5种方式,一次性说清楚!
这里都是一些个人血和泪的经验~1)锁的粒度太大,容易出现很多线程阻塞等待锁的情况,导致程序并发性差而如果锁的粒度太细,过度的锁开销会使系统性能受到影响,代码变的复杂,所以要找到一个平衡2)在程序开发中,写完lock之后,就要条件反射一般,将unlock写好,防止之后忘记3)在函数内进行lock之后,一定要谨防函数直接return的情况,return 之前要释放锁,否则下次拿锁会出现死锁的情况。4)带锁的线程,在使用pthread_cancle强制取消线程时,要对锁进行处理,详情可见。原创 2024-03-23 23:12:20 · 1461 阅读 · 0 评论 -
Linux多线程(1)- 线程基础概念及AP介绍
1)注册pthread_clean_up线程清理函数,在处理函数内释放锁、共享资源等(效率较高)2)加锁前,使用pthread_setcancelstate,禁止被cancle,随后再重新允许cancle(需要等到一段代码执行完)下面两个宏,分别是用方法1和方法2完成对锁的清理。原创 2024-03-21 19:53:00 · 624 阅读 · 0 评论 -
Linux中的并发与竞争(1)并发是如何发生的以及原子操作介绍
A、B、C任务,同时对共享数据段S进行访问A任务对S写入3000个字符"a",B任务对S写入3000个字符"b",C任务负责读取所有数据,当执行顺序如下时,A将数据从用户态拷贝完成后,还未累加当前访问下标,B便对数据进行了访问,此后C获取数据,获取到的数据并不是3000个字符"a",而是3000个字符"b"。原创 2024-02-22 23:55:56 · 392 阅读 · 0 评论 -
Linux中的并发与竞争(2)最简单的自旋锁概念及范例
当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。:如果持有锁的线程能在短时间内释放锁资源,那么竞争锁就不需要做内核态和用户态之间的切换,只需要等到持有锁的线程释放锁,避免了用户进程和内核切换的消耗。:为读和写提供了不同的锁,当没有写操作时,允许多个线程使用读锁,进行并发的读取操作。更适用于读取场合更多的情况。在进入临界区时,线程A获取到锁,并且保存中断状态,禁止了中断,防止被中断服务打断而造成死锁现象。原创 2024-02-22 23:59:07 · 508 阅读 · 0 评论