V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
heiher
V2EX  ›  Linux

Linux 多线程快速的 Condition waitting 方式

  •  
  •   heiher ·
    heiher · 2014-04-20 09:39:01 +08:00 · 3550 次点击
    这是一个创建于 3870 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有个应用需要快速的处理网络上的数据包,对响应时间有着较高的要求。考虑到数据包处理上要花一些时间, 还是搞成了多线程方式,线程的模型是是 1 个生产者持有 1000 个buffer、10 个消费者(消费者之间是独立的无共享部分,每个消费者持有连续的 100 个buffer),要做的是当生产者向一个消费者所属的 buffer list 放入数据后,消费者线程要以最快的速度处理。实验中发现直接使用 futex 系统调用实现 wake 和 wait 也会存在生产了、消费太慢的情况。好像 pthread_cond_wait 就是使用 futex 实现的吧?

    现在消费者不去 sleep,持续自旋查询 buffer 填充状态,其处理速度是可以接受的,但持续的 CPU 占用总觉得不合适?谁能给个解决方法呢?谢谢!
    9 条回复    2014-05-13 12:50:17 +08:00
    SErHo
        1
    SErHo  
       2014-04-20 09:54:44 +08:00 via Android
    你的自旋是怎么实现的,是不是将 buffer 当成循环数组,然后用类似无锁队列的模式来做的。
    heiher
        2
    heiher  
    OP
       2014-04-20 10:47:41 +08:00 via iPhone
    @SErHo 是的,有什么好办法吗?
    heimutuzhu
        3
    heimutuzhu  
       2014-04-20 22:33:58 +08:00
    pthread_cond_wait, pthread_cond_signal 做线程同步就可以搞定了。 好好看下这两api。 futex貌似更底层一点吧
    heiher
        4
    heiher  
    OP
       2014-04-21 00:00:06 +08:00 via iPhone
    @heimutuzhu 太慢了
    killgxlin
        5
    killgxlin  
       2014-04-28 01:36:25 +08:00
    会不会是读写buffer的时间太长了,所有数据是直接写到buffer里还是把存数据的内存的指针写到buffer里啊
    heiher
        6
    heiher  
    OP
       2014-04-28 09:26:41 +08:00
    这个问题解决了,不再使用一个专用的接收线程了(即生产者)。现在使用 Socket 的 fanout 模式,内核会自动把数据包调度到不同的线程上处理了。还使用了 zero-copy。
    heimutuzhu
        7
    heimutuzhu  
       2014-05-09 18:39:32 +08:00
    @heiher 你的问题修改了啊,不过从你的应用场景来看你这个实现思路有问题,消费者应该竞争所有的buffer,然后利用条件变量和锁来对消费者做线程同部。
    heiher
        8
    heiher  
    OP
       2014-05-10 00:26:12 +08:00 via iPhone
    @heimutuzhu 就在避免竞争。z z
    heimutuzhu
        9
    heimutuzhu  
       2014-05-13 12:50:17 +08:00
    @heiher 不竞争整体效率就不能达到最高, 因为不可避免地有些消费得快,有些慢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1401 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:30 · PVG 01:30 · LAX 09:30 · JFK 12:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.