我使用的内核版本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()函式的麻烦?除了使用这些功能外,还有什么其他的选择?
你可以从它崩溃的时间回溯(并将其添加到问题)吗? – 2013-03-04 09:54:48
我试过在信号处理程序上获得回溯(),但没有任何结果。我试图搞乱编译器的配置,但它似乎没有产生任何符号。 – 2013-03-04 10:10:26
没有说明usleep是如何工作的,不管它是否使用信号,或者是否与其他系统调用交互。所以,长话短说,就是不要使用它。有'nanosleep'这被设计为没有任何这样的问题。我的猜测是,每隔一段时间,你的信号在'fork'后进入错误的过程。这是假设你的互斥函数(没有显示)当然不会被破坏。 – Damon 2013-03-04 11:28:42