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

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 @ 2015-08-25 22:12  鸭子船长  阅读(5962)  评论(0编辑  收藏  举报