Linux分離執行緒問題

2021-10-08 03:00:11 字數 2627 閱讀 5520

問題:

在開啟camera過程中執行呼叫log_monitor_thread_init過程中建立log_monitor_thread_proc出現問題導致crash.

c3ac38a 07-03 08:34:36.482 8924 8924 f debug : signal 6 (sigabrt), code -1 (si_queue), fault addr --------

c3ac38b 07-03 08:34:36.482 8924 8924 f debug : abort message: 'invalid pthread_t 0xe503e1c0 passed to pthread_setname_np'

c3ac3a5 07-03 08:34:36.512 8924 8924 f debug : backtrace:

c3ac3a6 07-03 08:34:36.512 8924 8924 f debug : #00 pc 00038300 /apex/com.android.runtime/lib/bionic/libc.so (abort+172) (buildid: 29d129f5e3950af1f282b1036b38d770)

c3ac3a7 07-03 08:34:36.512 8924 8924 f debug : #01 pc 000806cf /apex/com.android.runtime/lib/bionic/libc.so (__pthread_internal_find(long, char const*)+98) (buildid: 29d129f5e3950af1f282b1036b38d770)

c3ac3a8 07-03 08:34:36.512 8924 8924 f debug : #02 pc 0008065b /apex/com.android.runtime/lib/bionic/libc.so (__pthread_internal_gettid(long, char const*)+2) (buildid: 29d129f5e3950af1f282b1036b38d770)

c3ac3a9 07-03 08:34:36.512 8924 8924 f debug : #03 pc 00082321 /apex/com.android.runtime/lib/bionic/libc.so (pthread_setname_np+112) (buildid: 29d129f5e3950af1f282b1036b38d770)

c3ac3aa 07-03 08:34:36.512 8924 8924 f debug : #04 pc 0008ef8b /vendor/lib/hw/camera.***xx.so (sprdcamera::sprdcamera3oemif::log_monitor_thread_init(void*)+126) (buildid: 8fa92e7c0bee051bf6d73f62c9e7b56d)

主要原因為:

pthread_attr_init(&attr);

pthread_attr_setdetachstate(&attr, pthread_create_detached);

ret = pthread_create(&obj->mloghandle, &attr,

log_monitor_thread_proc, (void *)obj);

pthread_setname_np(obj->mloghandle, "logstatus");

pthread_attr_destory(&attr);

使用分離執行緒方式建立,這種執行緒執行很快,而mlogmonitor列印為0,while迴圈不執行,該log_monitor_thread_proc立即退出,後續pthread_setname_np就可能出現非法位址。

m3ac194 07-03 08:34:36.418 474 8918 i cam3oemif: 10884, log_monitor_thread_proc: e, 0

原始碼: hal_logi("e, %d",mlogmonitor.load());

while(mlogmonitor.load() > 1)

>>signal非法位址

c3ac38a 07-03 08:34:36.482 8924 8924 f debug : signal 6 (sigabrt), code -1 (si_queue), fault addr --------

c3ac38b 07-03 08:34:36.482 8924 8924 f debug : abort message: 'invalid pthread_t 0xe503e1c0 passed to pthread_setname_np'

解決方法:

pthread_create_detached 分離執行緒建立的執行緒處理函式log_monitor_thread_proc是不能立即結束的。

(1)可以把 pthread_setname_np(obj->mloghandle, "logstatus"); 這行去掉;

(2)或者確定 log_monitor_thread_proc 不會立即退出;

(3)或者增加自旋鎖;

linux 分離執行緒

執行緒處於分離狀態後,當執行緒退出後,則有作業系統來負責系統的 建立分離狀態執行緒的方法有 2 執行緒屬性的設定函式 摘自 unix 環境高階程式設計 int makethread void fn void arg int err pthread t tid pthread attr t attr ...

linux分離執行緒

基本概念 分離執行緒的意義 個人理解在於是否需要關心執行緒的終止狀態,如果不需要,則設定為分離狀態。有兩種方法可以實現執行緒分離 1.呼叫pthread detach include int pthread detach pthread t thread 2.通過傳給pthread create函式...

關於分離執行緒

執行緒的分離狀態決定乙個執行緒以什麼樣的方式來終止自己。執行緒的預設屬性,一般是非分離狀態,這種情況下,原有的執行緒等待建立的執行緒結束。只有當pthread join 函式返回時,建立的執行緒才算終止,才能釋放自己占用的系統資源。而分離執行緒沒有被其他的執行緒所等待,自己執行結束了,執行緒也就終止...