在OSX上,pthread_join断断续续地崩溃,出现分段错误



我在加入子线程时遇到了分段错误,我已经用尽了所有我能想到的调试选项,查看堆栈溢出和互联网的其余部分!我会的尽可能彻底。代码是用c++编写的,并在OSX 10.6.8上使用GNU GCC进行编译。我使用'-pthread'参数链接了'pthread'库。我也试过"-lphtread"。没有区别。

我使用以下全局变量:

pthread_t gTid;
pthread_attr_t gAttr;
int gExitThread = 0;

我正在创建一个子线程从我的主线程执行:

err = pthread_attr_init(&gAttr);
if (err)
{
    throw CONTROLLER_THREAD_ERROR;
}
err = pthread_attr_setdetachstate(&gAttr, PTHREAD_CREATE_JOINABLE);
if (err)
{
    throw CONTROLLER_THREAD_ERROR;
}
err = pthread_create(&gTid,&gAttr,threadHandler,NULL);
if (err)
{
    throw CONTROLLER_THREAD_ERROR;
}

在'threadHandler'内部,我使用核心基础API有以下运行循环:

// Enter run loop
result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, RUN_LOOP_TIMEOUT, false);
while (result == kCFRunLoopRunTimedOut)
{
    if (gExitThread) break;
    result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, RUN_LOOP_TIMEOUT, false);
}

gExitThread全局变量用于通知线程应该优雅地终止本身。RUN_LOOP_TIMEOUT宏被设置为2秒(尽管值的大小没有区别)。

主线程中的以下代码段通知线程被终止:

int err = 0;
void* exitValue = NULL;
printf("Stopping controller thread...n");
gExitThread = 1;
err = pthread_join(gTid, &exitValue);
if (err)
{
    displayError2(err);
    throw CONTROLLER_THREAD_ERROR;
}
err = pthread_attr_destroy(&gAttr);
if (err)
{
    throw CONTROLLER_THREAD_ERROR;
}

对'pthread_join'的调用在短暂延迟后由于分段错误而崩溃。我还注意到,将'pthread_join'的调用替换为正常的睡眠(比如两秒),在执行' ussleep(2000000)'时会导致完全相同的分段错误!我将复制下面'pthread_join'和' ussleep '的核心转储的反向跟踪。

pthread_join:

#0  0x00007fff8343aa6a in __semwait_signal ()
#1  0x00007fff83461896 in pthread_join ()
#2  0x000000010000179d in Controller::cleanup () at src/native/osx/controllers.cpp:335
#3  0x0000000100008e51 in ControllersTest::performTest (this=0x100211bf0) at unittests/src/controllers_test.cpp:70
#4  0x000000010000e5b9 in main (argc=2, argv=0x7fff5fbff980) at unittests/src/verify.cpp:34

usleep (2000000):

#0  0x00007fff8343aa6a in __semwait_signal ()
#1  0x00007fff8343a8f9 in nanosleep ()
#2  0x00007fff8343a863 in usleep ()
#3  0x000000010000177b in Controller::cleanup () at src/native/osx/controllers.cpp:335
#4  0x0000000100008e3d in ControllersTest::performTest (this=0x100211bf0) at unittests/src/controllers_test.cpp:70
#5  0x000000010000e5a5 in main (argc=2, argv=0x7fff5fbff980) at unittests/src/verify.cpp:34

似乎threadHandler内部while循环后的代码正在导致段错误。如果在线程内部产生了一个信号(例如SIGSEGV),则进程本身将被终止。

尝试使用GDBthread apply all bt来回溯所有线程

最新更新