2013-12-11 197 views
1

我有一个应用程序有一个主线程产生另一个线程,它为每个收到的请求产生线程,我得到一个核心转储可能是由于死锁。上的gdb我看到以下内容:产卵线程时死锁?

__lll_lock_wait_private(); 
_L_lock_4714(); 
start_thread(); 
clone(); 

这是从下面的代码样品产生:

do 
{ 
    pthread_t handle; 
    pthread_attr_t attr; 
    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 
    pthread_create(&handle, 0, run, msg); 
    pthread_detach(handle); 
} while (!stop) 

运行是一个外部功能,而代码的其余部分是类方法的一部分。

void* run(void* arg) 
{ 
    Handler handler; 
    Msg* msg = static_cast<Msg*> (arg); 

    handler.handleMsg(msg); 

    return NULL; 
} 

handleMsg方法进行一些处理,然后调用另一个应用程序通系统调用:

... 
system("AnotherApplication param1, param2 &"); 
... 

注意符号。这是有意的,因为我希望进程异步运行。响应通过另一种类型的通信进入主线程。

此应用程序已经在Linux上运行:

的Linux 2.6.32-358.14.1.el6.x86_64#1 SMP周一6月17日15时54分二十秒EDT 2013 x86_64的x86_64的x86_64的GNU/Linux的

我不会忽略任何信号。

这里有什么问题?

+0

这是字面上你的线程启动循环?尽可能多地旋转*,尽可能快*直到局部变量变为真(它可能永远不变)? – WhozCraig

+1

您是否检查任何这些调用的返回码并将它们回复或记录在某处? – Duck

回答

0

pthread_detach手册告诉我们:

试图脱离明确的行为已经分离线程的结果。

但是,您创建的线程是从启动时分离的。

您期待什么结果?

+1

其实OP不会将他的线程创建为分离的。他设置了属性,但他从不将attr传递给'pthread_create':'pthread_create(&handle,0,run,msg);' – Duck