問題:
在開啟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 函式返回時,建立的執行緒才算終止,才能釋放自己占用的系統資源。而分離執行緒沒有被其他的執行緒所等待,自己執行結束了,執行緒也就終止...