Я не понимаю, почему при разрушении std::thread
он должен находиться в состоянии join() или detach().
Присоединение ожидает завершения потока, а отсоединение - нет. Кажется, есть какое-то среднее состояние, которое я не понимаю. Поскольку я понимаю, что join и detach дополняют друг друга: если я не вызываю join(), то по умолчанию используется detach().
Скажем так: допустим, вы пишете программу, которая создает поток, и только позже в жизни этого потока вы вызываете join(), поэтому до тех пор, пока вы не вызовете join, поток в основном работал так, как если бы он был отсоединен, нет?
Логически detach() должно быть поведением по умолчанию для потоков, потому что это определение потоков, которые выполняются параллельно независимо от других потоков.
Итак, когда объект потока разрушается, почему вызывается terminate()? Почему стандарт не может просто рассматривать нить как отсоединенную?
Я не понимаю смысла завершения программы, когда join() или detached() не вызывались до разрушения потока. Какова цель этого?
UPDATE:
Я недавно сталкивался с этим. Энтони Уильямс в своей книге "Параллельность в действии" заявляет: "Одно из предложений для С++ 17 было для класса joining_thread, который был бы похож на std::thread, за исключением того, что он автоматически включался бы в деструктор так же, как это делает scoped_thread. Это не получило консенсуса в комитете, поэтому он не был принят в стандарт (хотя он все еще на пути к С++ 20 как std::jthread)... "