Linux非阻塞抢锁,总是抢不上,请各位指教

adfa 2017-01-15 09:46:39
先贴一下代码
主线程A用来接收消息

//如果来新消息,主线程就轮训抢12个工作线程的fifo的锁
for( /*这里轮训12个工作线程的消息队列*/ )
{
if( pthread_mutex_trylock(&(worker->mutex)==0))
{
//如果抢到了,就把消息加入到该队列中
if( fifo_equeue(&(work->msg_fifo)), msg )
{
.....
}
}
}
//如果12个队列的锁都没有抢到,那就说明队列满了,把该消息丢掉


12个工作线程,用来处理主线程A,发过来的报文

//子工作线程,持续抢锁,如果发现消息队列中存在消息
//就取出来,如果没有,就等待主线程将消息加入队列中
while(1)
{
pthread_mutex_lock(&(work->mutex))
//如果工作线程自己的消息队列为空
if( fifo_empty(&(work->msg_fifo) )
{
//等待主线程将消息加入队列中
pthread_cond_wait(&(work->cond), &(work->mutex))
}
//取出消息队列中的消息
while( fifo_dequeue(&(work->msg_fifo), (void**)*msg_buf[mbuf_id])==0)
{
/* 在这里最多只去100个,取完100个消息就会解锁,再去处理消息 */
}
//如果消息队列中的消息数量不到100个,那么就解锁,然后处理消息
}


主线程A用来接收消息,然后分发到工作线程中。一共有12个工作线程,每个线程有自己的消息队列。
但是遇见一个很奇怪的问题,12个工作线程的消息队列都没有满,但是主线程A就是抢不到12个工作线程的锁。
这份代码已经在很对地方使用了,都没有出现问题。就一个地方最近出现问题,并且一天之中会出现几次。到现在收了4亿多个包,丢掉了1万多个包。
查看抢不到锁时候的CPU,发现也都是正常的。并且主线程A和12个工作线程都已经绑定在不同的CPU上,所以应该不会涉及到由于系统调度导致的抢不到锁的问题。

请问各位,有没有类似的问题。
...全文
343 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
nswcfd 2017-01-20
  • 打赏
  • 举报
回复
使用模式上貌似没有问题? 不过理论上确实存在12个trylock都失败的情况呀,不过这不一定意味着队列full。 可以加入一些retry逻辑,比如再次轮询12一圈,这样概率会降低一些吧。

18,772

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧