2010-09-21 16 views
49

używam biblioteki pthread do tworzenia & łączące wątki w CWolnostojący vs. PŁYCIE POSIX podaje

  1. Kiedy należy utworzyć wątku jako indywidualny, od samego początku? Czy oferuje przewagę wydajności w stosunku do łączonego wątku?

  2. Czy to jest legalne, aby nie pthread_join() na wątku joinable (domyślnie)? Czy powinien taki wątek zawsze używać funkcji odłączania() przed pthread_exit() ing?

Odpowiedz

67
  1. Tworzenie wolnostojący wątek gdy wiesz, że nie będzie chciał czekać na niego z pthread_join(). Jedyną zaletą wydajności jest to, że po odłączeniu wątku jego zasoby mogą zostać zwolnione natychmiast, zamiast czekać na dołączenie wątku, zanim zasoby zostaną zwolnione.

  2. "Legalne" nie przyłączanie się do łączonego wątku; ale zwykle nie jest to wskazane, ponieważ (jak wspomniano wcześniej) zasoby nie zostaną udostępnione, dopóki wątek nie zostanie przyłączony, więc pozostaną one powiązane przez czas nieokreślony (do czasu wyjścia programu), jeśli nie dołączysz do niego.

+0

Wątpliwość: w przypadku oderwanych wątków, co jeśli główny wątek zakończy wykonywanie przed odłączonym wątkiem? Myślę, że to zakończy proces zabijania wszystkich wątków. Więc w jakich scenariuszach są używane oderwane wątki, ponieważ powinienem być pewien, że odłączony wątek zakończył wykonywanie? – Ajax

+0

@Ajax: Empirycznie, jeśli główny wątek się zakończy, program zostanie zamknięty, a wątki zakończone. To przynajmniej wydaje się być zachowanie na Mac OS X (10.10.1 Yosemite). Nie mogę znaleźć niczego w dokumentacji POSIX, która wskazuje, że inne wątki będą kontynuowane, jeśli wywoływane jest 'exit()' lub '_exit()' lub '_Exit()'. Jeśli główny wątek robi 'pthread_exit()', wtedy inne wątki mają szansę na zakończenie. –

+0

Inna uwaga: Odłączalne nici są dobre, gdy masz już jakiś inny mechanizm odpytywania; możesz użyć tego samego mechanizmu odpytywania, aby sprawdzić stan wyniku, a więc wiedzieć, czy wątek został ukończony. Jest to przypadek: "Czy jest gotowy? Jeśli tak, użyj go". –