当前位置: 技术问答>linux和unix
读写问题,请求优秀的处理方案
来源: 互联网 发布时间:2016-05-04
本文导语: 问个问题,有个消息队列,两个线程,一个负责写,一个负责读。当消息队列有数据时,读线程将消息弹出,否则等待。当需要写时,写线程将消息压入队列。linux怎么处理?使用POSIX/C。 现有方案: 1、写消息时,...
问个问题,有个消息队列,两个线程,一个负责写,一个负责读。当消息队列有数据时,读线程将消息弹出,否则等待。当需要写时,写线程将消息压入队列。linux怎么处理?使用POSIX/C。
现有方案:
1、写消息时,使用mutex/spinlock锁定消息队列。
2、写完后,使用pthread_cond_signal/sem_post通知
3、读线程使用mutex/spinlock检查,有则从队列中摘取消息
4、使用pthread_cond_wait/sem_wait等待。
由于使用2个锁,感觉不是很好。请求尽量简洁的方案。
现有方案:
1、写消息时,使用mutex/spinlock锁定消息队列。
2、写完后,使用pthread_cond_signal/sem_post通知
3、读线程使用mutex/spinlock检查,有则从队列中摘取消息
4、使用pthread_cond_wait/sem_wait等待。
由于使用2个锁,感觉不是很好。请求尽量简洁的方案。
|
我是说你自己实现的队列怎么可以用select(),
我看1楼也跟我2楼的回答一样,以为你用的是系统自带的消息队列。
你自己实现的如你三楼的基于链表的队列,怎么可能可以使用select()?
select()也只是内核封装了一下数据源情况有变化时的触发机制,你如何可以直接用到你自己实现的队列里去?
我看1楼也跟我2楼的回答一样,以为你用的是系统自带的消息队列。
你自己实现的如你三楼的基于链表的队列,怎么可能可以使用select()?
select()也只是内核封装了一下数据源情况有变化时的触发机制,你如何可以直接用到你自己实现的队列里去?
|
可以将消息队列和一个管道结合起来用,这样就可以用select()或者poll()了。unix网络编程卷2里面有现成的例子,你可以参考一下。