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());來分離自己。