2013-10-11 2 views
2

Учитывая простую программу, которая использует C++ 11 функции многопоточной:Здания C++ 11 потоковых перевод-единиц в Linux

#include <iostream> 
#include <thread> 

using namespace std; 

void dont_thread_on_me() { 
    cout << "action from another thread" << endl; 
} 

int main() { 
    thread t { dont_thread_on_me }; 
    t.detach(); 

    cin.get(); 
} 

Если я построить приложение с помощью:

c++ -std=c++11 Program.cpp -o Program.out 

программы строит штраф, но когда я запускаю его, я получаю:

./Program.out 
terminate called after throwing an instance of 'std::system_error' 
    what(): Operation not permitted 
Aborted 

Если я построить его с -pthread как в:

c++ -std=c++11 Program.cpp -o Program.out -pthread 

программа выполняет штраф. Я не видел никаких других функций C++ 11, которым требуются специальные флаги сборки, почему это происходит?

+1

См. Http://stackoverflow.com/questions/11784153/in-g-is-c-11-thread-model-using-pthreads-in-the-background – wich

+1

См. Http://stackoverflow.com/questions/9945391/stdthread-создание броски-исключение –

ответ

2

Исключено исключение _M_start_thread, определенное в gcc-4.7.3/libstdc++-v3/src/c++11/thread.cc.

Это исключение вызывается, если функция с именем __gthread_active_p возвращает нулевое значение. Эта функция является функцией C, определенной в gcc-4.7.3/libgcc/gthr-posix.h.

Этот метод выкачивает в libc для функций pthread и, по-видимому, выполняет некоторые фанки исполнения/ленивые привязки. Ваши ссылки на код C++ без проблем, потому что он не содержит зависимости времени ссылки на pthread. C-код может переносить недостающие значения ссылок для функций, которые он попытается решить во время выполнения.

К сожалению, проверка на совместимость с C++, которую мы обычно зависим, чтобы поймать эти проблемы, обходится, потому что связывание pthread выполняется посредством ленивой привязки в коде C.

Смежные вопросы