1. 程式人生 > >linux下 c中怎麼讓才能安全關閉執行緒

linux下 c中怎麼讓才能安全關閉執行緒

多執行緒退出有三種方式:
(1)執行完成後隱式退出;

(2)由執行緒本身顯示呼叫pthread_exit 函式退出;
    pthread_exit (void * retval) ; 

(3)被其他執行緒用pthread_cance函式終止:
    pthread_cance (pthread_t thread) ; 

用event來實現。

在子執行緒中,在迴圈內檢測event。
while(!e.is_active())
{
  ...
}
當退出迴圈體的時候,自然return返回。這樣子執行緒會優雅的結束。

注意:選用非等待的檢測函式。

pthread 執行緒有兩種狀態,joinable(非分離)狀態和detachable(分離)狀態,預設為joinable。

  joinable:當執行緒函式自己返回退出或pthread_exit時都不會釋放執行緒所用資源,包括棧,執行緒描述符等(有人說有8k多,未經驗證)。

  detachable:執行緒結束時會自動釋放資源。

Linux man page said:

When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore, pthread_join must be called  once  for each joinable thread created to avoid memory leaks.

因此,joinable 執行緒執行完後不使用pthread_join的話就會造成記憶體洩漏。

解決辦法:

1.// 建立執行緒前設定 PTHREAD_CREATE_DETACHED 屬性

pthread_attr_t attr; pthread_t thread; pthread_attr_init (&attr); pthread_attr_setdetachstat(&attr, PTHREAD_CREATE_DETACHED); pthread_create (&thread, &attr, &thread_function, NULL); pthread_attr_destroy (&attr);


2.當執行緒為joinable時,使用pthread_join來獲取執行緒返回值,並釋放資源。

3.當執行緒為joinable時,也可線上程中呼叫 pthread_detach(pthread_self());來分離自己。