多线程访问共享内存的不加锁实现方式

http://blog.csdn.net/alane1986/article/details/6887359

 

多线程访问共享内存,为了实现同步,常采用加锁的方式。

那么,如何采用不加锁的方式来达到线程同步的目的呢?

思路:

保存两块共享内存,一块用于读操作,一块用于写操作。

初始时,两块共享内存内容一致。读操作均是读取第一块共享内存的数据;写操作均是写第二块共享内存。

在多个读操作一个写操作的情况下,读操作均从第一块共享内存读取,写操作修改第二块共享内存的数据。直至写操作完成,交换两块共享内存的下标,即第二块共享内存用于接下来的读操作,第一块共享内存根据第二块共享内存数据更新,用于接来下的写操作。

 

 

参考:

http://godorz.info/2010/05/synchronous-memory-access-for-multithread/

 

 

多线程的程序有很多的优点,就不一一列举了,这里主要记录一些工作的片段,看看多线程在我的工作处于一个什么样的角色。 在一个进程空间里,新增一个线程的原因可能有很多,其中一个原因可能是增强程序的异步执行能力,把比较耗时的部分放到新线程里面去执行, 这样能减轻主线程的压力,提高主线程的逻辑处理能力和提高主线程的响应能力。线程要想相互协作,就要能相互通信,更多的情况下,是通过共享临界资源来协作的。这里主要介绍如何不加锁就能实现多线程对共享内存的访问。


    假设有两个线程共享同一块内存, 生产者线程不断的添加一些指令到共享区域,消费线程的责任是处理共享区域里的指令,通过加锁是能够简单清晰的解决这个问题的。深入分析一下,就不难发现,不用加锁也能解决这个问题。把指令放入共享区域,对于生产者线程来说,整个过程是个流水线,是顺序执行的;从共享区域取出指令来解析,这个过程对于消费者线程来说也是顺序执行的。 考虑到这个特性,共享区域可以使用一个先进先出(FIFO)的队列来实现,生产线程把指令在队列头部加入,消费线程在队列尾部取出消息,进行解析。 这里主要得考虑一个情况,生产线程还没有把某个指令全部放入队列,消费线程就要来取了, 可以考虑给每个指令附加一个状态如: volatile bool state; 当生产者把消息加入队列后,把state置为真,消费费发现某个指令的状态为真时,就知道该指令是可处理的了, 这里的volatile 一定不能忘记,只有保证对state的赋值是原子操作才能避免潜在的内存错误。

posted @   鸭子船长  阅读(5987)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示