multithreading - pthread_join 因 OSX 上的段错误而间歇性崩溃

标签 multithreading macos thread-safety pthreads

我在加入子线程时遇到了段错误,我已经用尽了我能想到的调试的所有选项,查看 Stack-overflow 和 Internet 的其余部分! :) 我将会
尽可能彻底。代码是用 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”的调用替换为比方说两秒的正常 sleep ,在执行“usleep(2000000)”时会导致完全相同的段错误!
我将复制下面“pthread_join”和“usleep”的核心转储的回溯。

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为了获得所有线程的回溯。

关于multithreading - pthread_join 因 OSX 上的段错误而间歇性崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7686177/

相关文章:

当一项变化时计算表达式的变化(多线程)

java - 从线程外部、线程运行内部设置 boolean 值

c++ - ld : library not found for -lcrypto MacOS

c++ - 仅使用 8 字节 CAS 无锁? C++

来自另一个线程的 C# UnhandledException 不断循环

java - 用java非阻塞MySQL更新?

windows - 根据 bash 中的操作系统运行不同命令的最佳方法

macos - "s-[keyname]"在 Emacs 中指的是什么,我如何告诉 Emacs 忽略它?

c++ - 仅使用 get 或 set 的原始类型的线程安全威胁是否被夸大了?

c++ - 将参数移动到 std::thread 中?