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


    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的赋值是原子操作才能避免潜在的内存错误。

  • 相关阅读:
    ACM训练计划
    动态规划 最长公共子序列LCS
    Floyd最短路
    邻接表拓扑排序
    数字三角形(数塔) DP入门
    hdu 5533 计算几何 判断是否为正方形
    威尔逊定理--HDU2973
    二分--POJ-3258
    01背包--hdu2639
    矩阵快速幂--51nod-1242斐波那契数列的第N项
  • 原文地址:https://www.cnblogs.com/zl1991/p/4758860.html
Copyright © 2020-2023  润新知