作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有两个内核线程,分别运行 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 会变高。没有打印任何 panic 信息。有没有人有想法?
最佳答案
我们想解决的越多,得到的就越少....
正如 Lizz 所说,我添加了很多 printk 来打印一些调试信息。但我什么也没得到,因为“printk”是造成该错误的主要原因。
我做了下面的实验,我发现了一个令人难以置信的结果。
运行 a() 的 1 个线程和 b() 的 1024 个线程。 a() 在 while 循环中唤醒每个 b()
修改printk如下。
write_lock_bh( &pk_lock );
printk( "print some debugging message" );
write_unlock_bh( &pk_lock );
有锁运行一次,无锁运行一次。
没有锁,它挂了。
带锁,正常运行。
最初,printk 是为了调试。现在这似乎是根本原因。
有没有人有这样的经验?
关于linux - 内核代码 wait_event() 和 wake_up() 下系统挂起和 CPU 高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19372205/
我是内核新手。我在阅读源代码时遇到了这个问题。 在wait_event()的实现中,内核做了这样的事情: ... prepare_to_wait(); /* enqueue current threa
我有两个内核线程,分别运行 a() 和 b()。 a() 正在尝试唤醒 b(),如下所示。 a() { while(1) { while( atomic_read(status)
我是一名优秀的程序员,十分优秀!