2016-04-12 3 views
4

Следующий простой код (C++ 11) будет запускаться только найти на Mac OS и Linux:станд :: Thread.join() SIGSEGV на Mac OS под Valgrind

#include <thread> 
#include <chrono> 
#include <iostream> 

void threadFunction() { 
    for (int cc=0; cc < 10000000; ++cc) { 
     if (cc%1000000 == 0) { 
      std::this_thread::sleep_for(std::chrono::milliseconds(200)); 
     } 
    } 
} 


int main(int argc, char **argv) { 
    std::thread threads[10]; 
    for (int tt = 0; tt < 10; ++tt) { 
     threads[tt] = std::thread(threadFunction); 
    } 
    // Wait for the threads to complete 
    for (int tt = 0; tt < 10; ++tt) { 
     printf("About to join %d\n", tt); 
     std::cout.flush(); 
     threads[tt].join(); 
     printf("Joined %d\n", tt); 
     std::cout.flush(); 
    } 
    return 0; 
} 

Однако выполнение обертывание в Valgrind:

valgrind --leak-check=full --show-reachable=no --track-fds=yes --error-exitcode=1 --track-origins=yes ./theexecutable 

... и теперь он работает на Linux, но не на Mac OSX, в противном случае с:

==47544== Process terminating with default action of signal 11 (SIGSEGV) 
==47544== Access not within mapped region at address 0x700008F31C3E 
==47544== at 0x10052E37F: _pthread_find_thread (in /usr/lib/system/libsystem_pthread.dylib) 
==47544== by 0x100530D52: _pthread_join_cleanup (in /usr/lib/system/libsystem_pthread.dylib) 
==47544== by 0x100530C63: pthread_join (in /usr/lib/system/libsystem_pthread.dylib) 
==47544== by 0x100057E94: std::__1::thread::join() (in /usr/lib/libc++.1.dylib) 
==47544== by 0x100001BB1: main (in ./vgtest) 

Любые идеи, почему это не удается (и только на OSX)?

Valgrind-3.11.0, OSX 10.11.3

+0

Поднял ошибку Valgrind для этого: https://bugs.kde.org/show_bug.cgi?id=363123 – KevinD

+1

спасибо за сообщение об ошибке. Для тех, кто читает это позже, проблема в настоящее время известна, и главная ошибка отслеживания можно найти здесь: https://bugs.kde.org/show_bug.cgi?id=349128. Отчет об ошибке KevinD был отмечен как дубликат. –

ответ