看個例子
1class
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時主線程不一定賦值已經完成,就會造成空指標的操作,加鎖可避免這種問題
附乙個別人遇到的問題
1consoleuploadfile::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...