У меня есть программа, которая использует потоки boost. У программы есть функции запуска и остановки. Когда программа запускается, я создаю поток повышения, который выполняет некоторую обработку. Когда программа остановлена, я вызываю соединение в этом потоке и удаляю указатель потока. Моя программа запускается и останавливается правильно в первый раз; Однако, когда я пытаюсь запустить свою программу во второй раз я не утверждение внутри наддува (когда newing обработка резьбы) и следующий выводится на моем экранеboost thread error
/root/src/boost.cmake/libs/thread/src/pthread/once.cpp:46: unsigned long &boost::detail::get_once_per_thread_epoch(): Assertion`!pthread_setspecific(epoch_tss_key,data)' failed.
Я знаю, что мой присоединиться правильно, потому что работает когда поток обработки выходит, я выводю сообщение на консоль. Кто-нибудь знает, почему это может случиться?
Дополнительная заметка ... Я немного поиграл с моим кодом, и методология, которую я использую для очистки потоков повышения, работает в других частях моей программы (например, если я создаю boost :: thread в родительском классе). Однако он терпит неудачу каждый раз в дочернем классе (который является абстрактным классом).
Мой старт и стоп методы выглядит так ...
void ThreadMethod()
{
while(_runningThread)
{
}
}
void Start()
{
_runningThread = true;
_thread = boost::make_shared<boost::thread>(&TestChildVirtualClass::ThreadMethod, this);
};
void Stop()
{
_runningThread = false;
_thread->join();
if(_thread)
{
_thread.reset();
}
};
Однако, у меня возникли проблемы воссоздавая этот вопрос в тестовой программе (хотя это происходит каждый раз, когда в моей реальной программе).
Отладить программу и поместить контрольную точку в код, указанный в вопросе. Кажется, он должен быть вызван один раз в потоке, поэтому вызов * second * должен идентифицировать вашу проблему. –
Успешное соединение означает, что поток завершил выполнение. Чтобы выполнить снова, вам нужно создать другой поток. –
Какую платформу/компилятор и версию вы используете? –