多线程访问共享内存的不加锁实现方式
2015-08-25 22:12
344 查看
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的赋值是原子操作才能避免潜在的内存错误。
多线程访问共享内存,为了实现同步,常采用加锁的方式。
那么,如何采用不加锁的方式来达到线程同步的目的呢?
思路:
保存两块共享内存,一块用于读操作,一块用于写操作。
初始时,两块共享内存内容一致。读操作均是读取第一块共享内存的数据;写操作均是写第二块共享内存。
在多个读操作一个写操作的情况下,读操作均从第一块共享内存读取,写操作修改第二块共享内存的数据。直至写操作完成,交换两块共享内存的下标,即第二块共享内存用于接下来的读操作,第一块共享内存根据第二块共享内存数据更新,用于接来下的写操作。
参考:
http://godorz.info/2010/05/synchronous-memory-access-for-multithread/
多线程的程序有很多的优点,就不一一列举了,这里主要记录一些工作的片段,看看多线程在我的工作处于一个什么样的角色。 在一个进程空间里,新增一个线程的原因可能有很多,其中一个原因可能是增强程序的异步执行能力,把比较耗时的部分放到新线程里面去执行, 这样能减轻主线程的压力,提高主线程的逻辑处理能力和提高主线程的响应能力。线程要想相互协作,就要能相互通信,更多的情况下,是通过共享临界资源来协作的。这里主要介绍如何不加锁就能实现多线程对共享内存的访问。
假设有两个线程共享同一块内存, 生产者线程不断的添加一些指令到共享区域,消费线程的责任是处理共享区域里的指令,通过加锁是能够简单清晰的解决这个问题的。深入分析一下,就不难发现,不用加锁也能解决这个问题。把指令放入共享区域,对于生产者线程来说,整个过程是个流水线,是顺序执行的;从共享区域取出指令来解析,这个过程对于消费者线程来说也是顺序执行的。 考虑到这个特性,共享区域可以使用一个先进先出(FIFO)的队列来实现,生产线程把指令在队列头部加入,消费线程在队列尾部取出消息,进行解析。 这里主要得考虑一个情况,生产线程还没有把某个指令全部放入队列,消费线程就要来取了, 可以考虑给每个指令附加一个状态如: volatile bool state; 当生产者把消息加入队列后,把state置为真,消费费发现某个指令的状态为真时,就知道该指令是可处理的了, 这里的volatile 一定不能忘记,只有保证对state的赋值是原子操作才能避免潜在的内存错误。
相关文章推荐
- centos7无线网络连接
- 基本排序算法--归并排序
- HDOJ 题目2763 Housewife Wind(Link Cut Tree修改边权,查询两点间距离)
- 《黑天鹅》让我恐惧的一本书
- linux下rsync配置
- Http 专题一:概述
- 新手路过
- mysql 架构分层
- 庆祝 Linux 24 岁生日!
- 斯坦福大学自然语言处理第一课 “引言(introduction)”
- 9.链式A+B
- Jquery学习笔记---闭包
- 在Windows下使用Dev-C++开发基于pthread.h的多线程程序【转】
- Linux下用信号量实现对共享内存的访问保护
- HDU 2548Kindergarten (最大独立集 + 建图细节)
- 多线程之ThreadLocal类
- 单例模式(singleton pattern)
- 问题 I: 编程语言
- 从Ashley Madison泄露3300万用户数据分析用户构成
- istringstream小计