c thread 使用不當導致的崩潰問題

2022-02-02 10:38:29 字數 2455 閱讀 2025

看個例子

1

class

ctimer7//

開始8void

start()914

15void

run()

1622

23//

結束24

void

stop()

2532}33

private

:34 std::thread *t;

35 std::thread *t1;

36int

i;37

bool

b_exit;

38};

39void

main()

如圖所示,程式會崩潰,分析了是因為兩個執行緒都在編輯變數t,子執行緒呼叫t時主線程不一定賦值已經完成,就會造成空指標的操作,加鎖可避免這種問題

附乙個別人遇到的問題

1

consoleuploadfile::consoleuploadfile()27

8910很奇怪的是,**執行到std::thread(...)這句就崩潰了,還沒有跑子執行緒繫結的函式uploadfile,我開始懷疑不能在建構函式中開執行緒,就另寫了乙個成員函式,但也是執行到std::thread(..)就崩潰。google了一番,沒有進展,只能靠除錯了,崩潰的現場是這樣的:

1112

13 libc++.1.dylib`std::__1::thread::~thread():

1415

0x7fff8c2c9984:  pushq  %rbp

1617

0x7fff8c2c9985:  movq   %rsp, %rbp

1819

0x7fff8c2c9988:  cmpq   $0, (%rdi)

2021

0x7fff8c2c998c:  jne   0x7fff8c2c9990           ; std::__1::thread::~thread() +12

2223

0x7fff8c2c998e:  popq   %rbp

2425

0x7fff8c2c998f

:  ret    

2627

0x7fff8c2c9990:  callq  0x7fff8c2ca4fc            ; symbol stub for

: std::terminate()

2829

0x7fff8c2c9995

:  nop    

3031

32仔細看一下,這裡怎麼會呼叫thread的析構函式呢?問題就出在這裡,直接放乙個光溜溜的建構函式,當然會被馬上析構了...

3334

改成:35

36        _thread = std::thread( &consoleuploadfile::uploadfile, this

);37

38就可以了,_thread為成員變數。

3940

4142

可是,程式退出的時候,又崩潰了,是在析構函式崩潰的

4344 consoleuploadfile::~consoleuploadfile()

4547

48 libc++.1.dylib`std::__1::thread::~thread():

4950

0x7fff8c2c9984:  pushq  %rbp

5152

0x7fff8c2c9985:  movq   %rsp, %rbp

5354

0x7fff8c2c9988:  cmpq   $0, (%rdi)

5556

0x7fff8c2c998c:  jne   0x7fff8c2c9990            ; std::__1::thread::~thread() +12

5758

0x7fff8c2c998e:  popq   %rbp

5960

0x7fff8c2c998f

:  ret    

6162

0x7fff8c2c9990:  callq 0x7fff8c2ca4fc            ; symbol stub for

: std::terminate()

6364

0x7fff8c2c9995

:  nop    

6566

還是和子執行緒有關,看來是有什麼資源沒有釋放,又是一頓查,原來需要call 一下join(),文件上是這麼說的:

6768 after a call to this function, the thread object becomes non-joinable and can be destroyed safely.

6970

7172 consoleuploadfile::~consoleuploadfile()

7376

閉包,使用不當,會出問題

同事在初始化redis配置的時候,給dial函式賦值時用了閉包,導致程式上線後,資料怎麼都載入不到redis中去,排查了半個多小時,總算找到了罪魁禍首。雖然自己之前對閉包也算了解,但是看到他的那段 的時候,乍一看竟也沒發現出問題來,所以決定寫篇文章加深印象,避免自己以後也犯類似的問題。先上 func...

Select 使用不當引發的core,你應該知道的

排查乙個宕機問題,搞了好幾天時間,最終確定原因 最終確定問題原因,在此分享一下 如下rip不正確,指令位址錯亂,棧資訊已破壞 在此基礎上準確定位非常困難,但是仍可發現一些線索 根據當前棧資訊,大概尋找到懷疑的函式 檢視整個棧上下資訊,看有無懷疑的函式 所以很有可能就是fetchnsaddrev函式導...

條件變數使用不當引起的虛假喚醒

說到條件變數,首先說下互斥鎖,互斥鎖是最一種同步形式,用於保護臨界區,以保證任何時刻只有乙個執行緒在執行其中的 假設互斥鎖由多個執行緒共享 來保證共享資料的完整性,上鎖過程如下圖 假如在乙個程式中由3個執行緒訪問乙個共享變數g count,其中執行緒1和執行緒是負責對g count變數加一,執行緒3...