多執行緒環境下libcurl的乙個Bug

2021-06-17 21:42:49 字數 1769 閱讀 3089

今天運氣不錯,解決了兩個非常棘手的bug,這乙個是關於libcurl的。?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#0  0x4001e416 in __kernel_vsyscall ()

#1  0x40491941 in raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64

#2  0x40494e42 in abort () at abort.c:92

#3  0x404c9305 in __libc_message (do_abort=2,

fmt=0x4059f36a "*** %s ***: %s terminated\n")

at ../sysdeps/unix/sysv/linux/libc_fatal.c:189

#4  0x4054c970 in __fortify_fail (msg=)

at fortify_fail.c:32

#5  0x4054c8da in ____longjmp_chk ()

at ../sysdeps/unix/sysv/linux/i386/____longjmp_chk.s:76

#6  0x4054c849 in __longjmp_chk (env=, val=1)

at ../setjmp/longjmp.c:40

#7  0x4020dd08 in alarmfunc () from /usr/lib/libcurl-gnutls.so.4

#8 

#9  0x4001e416 in __kernel_vsyscall ()

#10 0x4004b930 in sem_wait@glibc_2.0 ()

at ../nptl/sysdeps/unix/sysv/linux/i386/i686/../i486/sem_wait.s:318

#11 0x400fa7ac in peekmessageex (pmsg=0xbffff0b8, hwnd=134580240,

imsgfiltermin=0, imsgfiltermax=0, bwait=1, uremovemsg=1) at message.c:628

#12 0x0804b45f in getmessage (this=0xbffff104)

at /usr/local/include/minigui/window.h:1935

#15 0x08049f4c in main (args=1, argv=0xbffff274) at main.cc:56

簡單說明一下,就是主迴圈在執行sem_wait時,被乙個訊號打斷,然後導致整個程式的崩潰。問題的關鍵就在那個alarmfunc (),是libcurl打斷了我的迴圈。

解決方法很簡單,把curlopt_nosignal設為1就行了,這樣libcurl將不會產生任何訊號:

多執行緒環境下的shared ptr

多個執行緒讀寫同乙個shared ptr物件需要加鎖 注意分清shared ptr物件與shared ptr管理的物件 mutexlock mutex shared ptr globalptr void read void write 上面的read 和write 在臨界區之外都沒有再訪問globa...

多執行緒環境下進行DEBUG

工具使用的是idea 1.debug模式下斷點的作用方式有兩種,all表示遇到斷點時,所有執行緒都會停滯在當前狀態中 並未掛起,依然都是可執行狀態 其他執行緒都無法繼續執行。當過掉這個斷點時,所有執行緒會同時開始爭搶cpu資源,這時是無法保證當前執行緒優先執行的。thread表示只中斷當前執行此行 ...

解決使用 libcurl 遇到的多執行緒崩潰問題

使用 curl 訪問 http 鏈結時,用 easy handle,阻塞方式訪問時發現會每個訪問啟動乙個執行緒去進行dns 想減少這種消耗,故此採用了 sh curl share init curl share setopt sh,curlshopt share,curl lock data dns...