2015-08-17 3 views
0

Кто-нибудь знает, почему это вызывает ошибку сегментации?Ошибка сегментации (ошибка ядра) при создании потока из функции-члена

int main() 
{ 
    udp_client *client = new udp_client("192.168.160.128", 2500); 
    client->mysetsockopt("af"); 
    client->askForFileAndID(); 
    client->getFileSize(); 

//this line causes the seg fault error 
    std::thread t1(&udp_client::sendFiletoServer, client); 


    return 0; 
} 
+0

Просто для того, чтобы быть уверенным: используете ли вы '-pthread' при компиляции? –

+0

У меня есть в моем включении. мне нужно добавить флаг -pthread во время компиляции? – ineedhelp

+0

Если вы используете GCC на linux, то да. от него зависит стандартная библиотека потоков. –

ответ

0

Вам необходимо связаться с pthreads. Чтобы это сделать, просто добавьте -pthread к вашим флагам компиляции.

Опасайтесь, что если вы хотите связать статически (плохая идея), вам также нужно будет добавить другие вещи. А именно: -Wl,--whole-archive -lpthread -Wl,--no-whole-archive

Проверить https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52590

2

ошибка Сегментирование происходит только во время выполнения, если у вас есть ошибка сегментации, вы собрали и связали свою программу. Вероятно, проблема в том, что ваша программа завершила выполнение после создания thread. Попытайтесь присоединиться к своему thread t1.

Добавить: t1.join();

перед возвращением из основных.

+0

При отсутствии флага -pthread при компиляции программа будет компилировать в порядке, но будет генерировать ошибки времени выполнения. Вы можете попробовать сами. Я согласен, однако, он также должен присоединиться к теме. –

+0

'-pthread' не используется в процессе компиляции, поэтому вы можете скомпилировать свой код, он используется в процессе связывания. Линкером не удастся без '-pthread'. Поправьте меня, если я ошибаюсь. –

+0

'-pthread' не является связующим флагом. Он добавляет '-lpthread' к процессу связывания, но он также делает некоторые другие вещи в некоторых системах (т. Е .: Маркировка файлов в качестве реентерабеля является одним из примеров). Как я уже сказал, пропущенный этот флаг не приведет к сбою в компиляции (и при связывании), но приведет к созданию плохой программы. Вероятно, это потому, что без '-pthread', некоторые заголовки не будут использовать символы из библиотеки pthreads и, следовательно, не должны быть связаны с ним. Однако им не удастся внести некоторые важные изменения в то, как они должны работать, делая их небезопасными. –

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