1

我有两个内核线程,分别运行 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会变高。没有打印任何恐慌消息。有没有人有想法?

4

2 回答 2

0

尝试在状态上加一个锁,锁会将 CPU a 的缓存中的状态刷新到主内存中,以便 CPU b 获得最新的更新。或者可能将状态设置为易失性。

于 2013-10-17T12:02:17.297 回答
0

我们想解决的越多,得到的就越少......

正如 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 本来是用来调试的。现在似乎是根本原因。

有没有人有这样的经历?

于 2013-10-16T08:14:12.230 回答