09 июл. 2012 г., 13:13 от Robert Hegner

Срочные изменения в Boost.Thread 3.0.0

В заметках о выпуске библиотек Boost версии 1.50.0 я отметил два серьезных изменения (посмотреть здесь):

#6266 Breaking change: thread destructor should call terminate if joinable.

#6269 Breaking change: thread move assignment should call terminate if joinable.

Что это значит для моих существующих проектов, использующих Boost 1.49.0? Должен ли я что-то изменить? Если да, что я должен изменить точно? И что произойдет, если я забуду изменить один из моих существующих проектов? Получу ли я ошибки во время компиляции (я надеюсь на это) или я получу неприятные и трудно обнаруживаемые проблемы во время выполнения (я абсолютно на это не надеюсь)?

Ответы на вопрос (0)

10 июл. 2012 г., 04:17 от Sam MillerIgor R.

но с v3 программа будет прервана какt выходит за рамки, потому чтоthread::~thread звонкиstd::terminateвместо того чтобы молча отсоединяться от темы:

#include <boost/thread.hpp> 
#include <iostream>

void f()
{}

int main() 
{ 
  {
    boost::thread t(f);
  }
  std::cout << "exiting gracefully" << std::endl;
} 
09 июл. 2012 г., 17:47 от Puppy

это означает, что «ваша программа не работает, если вы зависите от поведения, которое раньше было X, но теперь Y».

Для данных двух изменений это означает, что если вы полагаетесь на деструктор или вызываете перемещение присваиванияjoin() (или жеdetach()), который я считаю, было предыдущее поведение, ваша программа должна теперь явноjoin() или жеdetach() или встретить своего другаstd::terminate(), Это не ошибка во время компиляции, но и непредсказуемое поведение во время выполнения - вы получите хороший чистый сбой, ведущий прямо кboost::threadдеструктор, который является причиной проблемы.

ВАШ ОТВЕТ НА ВОПРОС