【发布时间】:2013-10-22 17:24:13
【问题描述】:
我有两个内核线程,分别运行 a() 和 b()。 a() 正在尝试唤醒 b(),如下所示。
a() {
while(1) {
while( atomic_read(status) != SET_SLEEP )
msleep(10);
atomic_set(status, SET_RUN);
printk( "..." );
wake_up( wq );
}
b() {
while(1) {
atomic_set(status, SET_SLEEP);
printk( "..." );
wait_event( wq, atomic_read(status) != SET_SLEEP );
printk( "..." );
}
长时间运行后,整个系统都会死机,CPU会变高。没有打印任何恐慌消息。有人知道吗?
【问题讨论】:
-
在问题出现之前它会运行多长时间?您是否打开了任何可用的调试来尝试缩小根本原因?
-
大约 10 分钟。我不知道打开可能的调试。它没有崩溃。刚刚上吊,什么也看不见。现在,我怀疑wait_event() 和wake_up() 中是否存在导致死锁和忙等待的“spin_lock”。
-
您可以通过使用变量名吐出某些值来创建调试。您还可以添加代码以显示 #CPU 线程等内容。
-
如果我增加线程 b() 的数量,它可能会挂起大约 1 分钟。
-
嗨 Lizz,我当然做到了。我什至打印了哪个线程正在哪个#CPU上工作,状态等等......但我什么也没得到。我怀疑他们被挂在 wait_event() 或 wake_up() 中。
标签: linux multithreading kernel wait