2012-05-07 3 views
3

У меня есть программа, которая использует потоки 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(); 
    } 
    }; 

Однако, у меня возникли проблемы воссоздавая этот вопрос в тестовой программе (хотя это происходит каждый раз, когда в моей реальной программе).

+1

Отладить программу и поместить контрольную точку в код, указанный в вопросе. Кажется, он должен быть вызван один раз в потоке, поэтому вызов * second * должен идентифицировать вашу проблему. –

+4

Успешное соединение означает, что поток завершил выполнение. Чтобы выполнить снова, вам нужно создать другой поток. –

+0

Какую платформу/компилятор и версию вы используете? –

ответ

0

Ошибка может быть ошибкой на Boost.Thread, поскольку в реализации call_once есть некоторые дыры (# 5752 boost :: call_once() ненадежна на некоторых платформах - см. https://svn.boost.org/trac/boost/ticket/5752). Это, конечно, зависит от того, на какой платформе вы используете свою программу.

Конечно, я, возможно, ошибаюсь.

Вы также должны защитить доступ к _runningThread.