- 论坛徽章:
- 0
|
本帖最后由 funtasty 于 2012-07-19 08:33 编辑
我有两个 处理数据报的缓冲队列,一个高速, 一个低速。 分别要记数。fast_len, slow_len.
而且 要在无数据报的时候 释放CPU。
代码大致如下:
while(1)
{
if (fast_len > 0)
{
spin_lock_bh(fast_lock);
fast_len--;
spin_unlock_bh(fast_lock);
} else if (slow_len > 0)
{
spin_lock_bh(slow_lock);
slow_len--;
spin_unlock_bh(slow_lock);
}
else
{
schedule_timeout(1);
}
}
现在存在的问题。INSMOD 之后会提示 bug : scheduling while atomic.
但是 schedule_timeout 没有在 锁中呀。。
求斑竹和达人给 点提示 给 跪谢了。
另一个线程做的操作跟这个线程差不多。 就是收数据包然后将计数+1.
if (iph->tos == fast)
{
spin_lock_bh(fast_lock);
fast_len++;
spin_unlock_bh(fast_lock);
} else if (iph->tos == slow)
{
spin_lock_bh(slow_lock);
slow_len++;
spin_unlock_bh(slow_lock);
}
锁问题已经解决了, 可以现在带来了一个新问题就是 收发效率过低。速度衰减了100倍。
求达人指点。 怎么在多核高使用率的情况下提高效率呢。
其实代码逻辑也非常简单。 两个线程 一个收包,一个发包, 两种数据包 快速慢速, 两把锁。
收包和发包肯定有同时进行的时候, 缓冲队列中没有包, 发包线程让出cpu一段时间。
godbach 版主 help~~~ |
|