Функции pthread_*
возвращают код ошибки;они не устанавливают errno
.(Ну, конечно, они могут, но никак не документировано.)
Ваш код должен распечатать значение, возвращаемое pthread_detach
, и распечатать его.
Single Unix Spec документирует двавозвращаемые значения для этой функции: ESRCH
(поток с этим идентификатором не найден) и EINVAL
(поток не присоединяемый).
Отсоединение потоков в деструкторе объекта кажется глупым.Во-первых, если они в конечном итоге будут отсоединены, почему бы просто не создать их таким образом?
Если есть какой-либо риск того, что потоки могут использовать уничтожаемый объект, их нужно остановить, а не отсоединить,Т.е. вы как-то указываете потокам, что они должны закрыться, а затем ждете, пока они достигнут какого-то безопасного места, после которого они больше не будут касаться объекта.pthread_join
полезен для этого.
Кроме того, уже немного поздно делать это с деструктором.Деструктор должен запускаться только тогда, когда выполняющий его поток является единственным потоком со ссылкой на этот объект.Если потоки все еще используют объект, вы уничтожаете его из-под них.