2016-01-07 4 views
2

Я знаю, что могу создать PTHREAD с подключаемом набором атрибутов, но когда-то создал,как проверить совместимость pthread?

  1. я прав, что я могу изменить, что PTHREAD к обособленным PTHREAD?
  2. Если это так, как я могу проверить, является ли pthread доступным? И как я могу изменить pthread от joinable до отсоединенного?
+1

Возможно, стоит упомянуть, что POSIX считает «pthread_join' [удобством]» (http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_join.html # tag_16_432_08), а не необходимость. Другими словами, вы можете переделать свой путь из этого вопроса, если ответы не то, что вам нравится. – pilcrow

ответ

1
  1. Да, вы можете. Просто позвоните pthread_detach() в теме.
  2. У вас есть несколько вариантов.

a. Если вы запустили свой поток с указанным pthread_attr, и этот pthread_attr все еще существует, вы можете надежно проверить состояние соединения, позвонив pthread_attr_getdetachstate. Если pthread_attr недоступен, и вы находитесь на Linux, вы можете запросить атрибут, вызвав pthread_getattr_np - обратите внимание, что _np означает non-Posix, поэтому это скорее всего будет Linux-only.

b. Вы можете просто попробовать присоединиться к нему. Обычно ptread, который не соединяется, будет return EINVAL. Это не стандартно с POSIX, но с чем-то можно положиться, например, с Linux, а также с Solaris и, вероятно, с другими основными системами.

c. Самый простой вариант - просто следить за своими потоками самостоятельно, чтобы вы всегда знали, может ли конкретный поток быть объединен, просто проверив состояние своей программы.

+3

Вы не можете зависеть от возвращаемого 'EINVAL'. из спецификации POSIX для 'pthread_join()': "Поведение не определено, если значение, указанное аргументом потока для pthread_join(), не относится к соединению". –

+0

@MichaelBurr, на той же странице написано: «Нить EINVAL - это не сплошная нить». Конечно, он должен быть совместимым, иначе функция вернет сбой. В Linux можно использовать EINVAL для несвязанных потоков. – SergeyA

+0

Я все равно отредактирую свой ответ, чтобы дать лучшее руководство. – SergeyA

0

Я прав, что я также могу изменить этот pthread на отдельный pthread?

Да, это правильно.

Если это так, как я могу проверить, является ли соединение pthread возможным?

Вы не можете, и просить об этом не имеет никакого смысла. Если у вас нет сопутствующего pthread, который вы знаете по факту, он еще не соединен, вам не нужно проверять pthread. Отсоединенный или соединенный, pthread может больше не существовать, поэтому для вас нет «pthread».

Невозможно проверить, является ли то, что может или не может быть потоком, является потоком. Люди, которые предлагают иначе, просят вас полагаться на поведение, которое не гарантируется, и это было бы крайне глупо.

И как я могу изменить pthread от присоединенного к отсоединенному?

Вы можете отсоединить его, или он может отсоединиться, в любое время, позвонив по телефону pthread_detach. Наиболее распространенным является то, что что-то владеет нитью, и эта вещь отвечает за присоединение потока, когда оно закончено (или завершено). Если вы просто хотите, чтобы поток работал до тех пор, пока он не будет выполняться без какого-либо контроля или владения, отсоедините его или отделите.

 Смежные вопросы

  • Нет связанных вопросов^_^