Сначала вам нужно выяснить, происходит ли ошибка от вашей функции, которая запускается std::thread
или от std::thread
. Если ваша функция выдает исключение, она будет перехвачена функцией запуска std::thread
, и будет вызван терминатор. Если вы сделаете свою функцию noexcept
, то terminate
будет вызываться до того, как она будет перехвачена, и вы увидите, откуда она выбрасывается в трассировке стека (более поздние версии GCC не улавливают исключение, поэтому это происходит автоматически).
Если исключение исходит из самого std::thread
, это означает, что ваша программа связалась с фиктивным определением pthread_create
в libc.so.6
вместо реального в libpthread.so
или libpthread.a
Используйте ldd
, чтобы увидеть, ссылается ли ваша программа на общий libpthread.so
или нет. Если это так, что-то не так с вашей цепочкой инструментов (вместо * слабый символ в libc.so
следует использовать определение в libpthread.so
). Если вы создаете статические ссылки, возможно, вам необходимо убедиться, что все символы из libpthread.a
включены в вашу программу, например, используя:
-Wl,--whole-archive -pthread -Wl,--no-whole-archive
N.B. вы должны использовать -pthread
, а не -lpthread
, поскольку это позволяет GCC убедиться, что он находится в нужном месте в команде link.