2013-03-04 46 views
2

我使用的内核版本2.6.10和“普通” C.系统+ usleep +多线程= SEGV/SIGILL

我已经缩减的两个线程,为什么我们的程序崩溃。

计时器线程

void TimerThread(void) 
{ 
    while (exec) { 
     usleep(10000); 

     RSLTCD r = SUCCESS; 
     // r = LockMutex(Mtx); 
     do { 
       // some process 
     } while(1);  
     // r = UnlockMutex(Mtx); 
    } 
    return ;  // Not Reached 
} 

系统线程

void SystemThread(void) 
{ 
    CreateThread(TimerThread, OALTHRD_DEFAULT_STACKSIZE, THREADPRI_NORMAL, 0, 0); 
    for(;;){ 
     system("echo this is a SYSTEM CALL 1"); 
     system("echo this is a SYSTEM CALL 2"); 
    }  
} 

我删除代码的所有的休息,即使只有运行这个两个“简单”的主题, 程序会在几圈(50-100)之后崩溃。 我也读过system()使用fork(),有时fork()ing和mutex有问题。 所以我删除了互斥部分,仍然崩溃。我尝试使用fork()+ execv()组合和posix_spawn()来创建自己的“系统调用”函数。 这两种情况都导致了相同的结果。

另外,我还使用其他睡眠功能比usleep试过。(nano_sleep等) 仍然是计划崩溃

有在多线程程序使用系统()和usleep()函式的麻烦?除了使用这些功能外,还有什么其他的选择?

+1

你可以从它崩溃的时间回溯(并将其添加到问题)吗? – 2013-03-04 09:54:48

+0

我试过在信号处理程序上获得回溯(),但没有任何结果。我试图搞乱编译器的配置,但它似乎没有产生任何符号。 – 2013-03-04 10:10:26

+3

没有说明usleep是如何工作的,不管它是否使用信号,或者是否与其他系统调用交互。所以,长话短说,就是不要使用它。有'nanosleep'这被设计为没有任何这样的问题。我的猜测是,每隔一段时间,你的信号在'fork'后进入错误的过程。这是假设你的互斥函数(没有显示)当然不会被破坏。 – Damon 2013-03-04 11:28:42

回答

1

基本上,混合多线程和“fork()”并不容易,并且需要更多关于SW的更多细节来提供有用的帮助。请参阅http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them以了解混合线程和fork()时的问题的描述。

+0

我已经阅读过很多次这个链接。这就是我发现互斥锁和fork()的地方。但是,正如你所看到的那样,即使删除这些互斥体并仅保留ulseep()。它仍然崩溃。我甚至删除了do-while块中的所有内容。 – 2013-03-04 10:13:39

+0

什么是其他线程在做什么,他们是否调用任何libc函数? “系统”至少会混淆信号并使用“等待”。你可以尝试用“fork/exec/wait”替换“system”吗?将采取更多代码,但会减少可能的故障点数量。 – user2116939 2013-03-04 11:29:48

+0

我发布的代码就是它的全部。我现在才运行和调试只有这两个主题,使用系统线程的“主线”。我已经删除了所有其他代码以查明它出错的位置。我也尝试过fork/exec/wait,导致了相同的错误。 – 2013-03-04 11:35:37