zoukankan      html  css  js  c++  java
  • 系统程序员成长计划并发(二)(上)

    转载时请注明出处和作者联系方式
    文章出处:http://www.limodev.cn/blog
    作者联系方式:李先静 <xianjimli at hotmail dot com>

    在 生产者-消费者的练习中,大部分人选择了由调用者来加锁:作为生产者,往双向链表里插入数据时,先加锁,插入数据,然后解锁。作为消费者,从双向链表里取 数据时,先加锁,删除数据,然后解锁。这是合理的,不过有点麻烦:每个调用者都要做这些动作,如果其中一个调用者忘记了解锁的步骤,就会造成死锁。而且调 用者必须要清楚自己是在多线程下工作,这些代码放到单线程的环境中就不能使用了。

    在很多情况下由实现者来加锁是比较好的选择,那样对调用者更为友好,可以避免出现一些不必要的错误。比如像目前Linux下流行的DBUS,它是一 套进程间通信框架,它支持单线程和多线程版本,但调用者不需要明确加锁/解锁,也不需要连接不同的库或者用宏来控制,单线程版本和多线程版本的不同只是在 一个初始化函数上。

    这里我们请读者对前面实现的双向链表做点改进:

    o 支持多线程和单线程版本。对于多线程版本,由实现者(在链表)加锁/解锁,对于单线程版本,其性能不受影响(或很小)。
    o区分单线程版本和多线程版本时,不需要链接不同的库,或者要宏来控制,完全可以在运行时切换。
    o 保持双向链表的通用性,不依赖于特定的平台。


    欢迎到Linux mobile development上交流


  • 相关阅读:
    MinGW离线包下载地址
    词法分析器--DFA(c++实现)
    linux下shell统计文件目录下所有代码行数
    四则运算表达式
    BliBli抢楼全攻略
    python 电影下载链接爬虫
    in, out, ref
    联合查询
    SQL语句大全
    LINQ
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167575.html
Copyright © 2011-2022 走看看