Почему деструктор boost :: thread отсоединяет присоединяемый поток вместо вызова terminate (), как предполагает стандарт? - PullRequest
9 голосов
/ 03 мая 2011

Согласно черновому стандарту C ++ 0x этот код:

void simplethread()
{
    boost::thread t(someLongRunningFunction);
    // Commented out detach - terminate() expected.
    // t.detach();  
}

... должен приводить к вызову terminate (), но в текущей (boost 1.46.1) реализации потоков boostэто не так, поток просто отсоединяется в деструкторе и продолжает работу.

Мой вопрос: почему?

Я думал, что boost :: thread так же встроен в черновой стандарт, как и сейчас.

Есть ли причина для этого?Будет ли это изменено в будущих версиях boost :: thread?

1 Ответ

24 голосов
/ 03 мая 2011

Причина в значительной степени историческая.boost::thread пришел первым.Предложения для std::thread были получены из boost::thread и первоначально имели поведение, которое boost::thread делает сейчас.

Однако в процессе стандартизации значительное число людей хотели от std::thread::~thread() до join() вдеструктор, если еще не присоединился, вместо detach().Аргументы были сделаны для каждой стороны, и голоса были взяты.50/50.Больше аргументов было сделано и больше голосов было принято.Некоторые люди были склонены к другой позиции.Но все равно 50/50.

Кто-то (я не помню, кто) предложил terminate().Голоса были взяты, и хотя это не было единодушно в пользу (я не мог голосовать за него), оно получило достаточно большинства, чтобы называться консенсусом.

Я думаю, boost::thread никогда не менялся, потому что это былоустановленная база пользователей, и никто не хочет излишне нарушать код для этой базы пользователей.

Редактировать:

Ах, Роб указывает нам на оригинал этого дублирующего вопроса иэтот ответ указывает на N2802 , что включает в себя обоснование.

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

...