一個 pthread_cancel 引起的執行緒死鎖【整理轉載】
阿新 • • 發佈:2019-01-27
[Thread debugging using libthread_db enabled]
Breakpoint 8, main () at testthread.cpp:3434if (pthread_create(&tid[0], NULL, thread0, NULL) !=0)
(gdb) bt
#0 main () at testthread.cpp:34
(gdb) n
[New Thread 0xb7fecb70 (LWP 2494)]
in thread 0 tag 1
Breakpoint 9, main () at testthread.cpp:3838if (pthread_create(&tid[1], NULL, thread1, NULL) !=0)
(gdb) bt
#0 main () at testthread.cpp:38
(gdb) n
[Switching to Thread 0xb7fecb70 (LWP 2494)]
Breakpoint 1, thread0 (arg=0x0) at testthread.cpp:1313 pthread_cond_wait(&cond, &mutex);
(gdb) n
[New Thread 0xb77ebb70 (LWP 2495)]
in main thread tag 1
[Switching to Thread0xb7fee6d0 (LWP 2491)]
Breakpoint 10, main () at testthread.cpp:4444 pthread_cancel(tid[0]);
(gdb) n
in thread 1 tag 1
Breakpoint 11, main () at testthread.cpp:4646 pthread_join(tid[0], NULL);
(gdb) n
[Switching to Thread 0xb77ebb70 (LWP 2495)]
Breakpoint 2, thread1 (arg=0x0) at testthread.cpp:2424 pthread_mutex_lock(&mutex);
(gdb) n
[Thread 0xb7fecb70 (LWP 2494) exited]
[Switching to Thread 0xb7fee6d0 (LWP 2491)]
Breakpoint 12, main () at testthread.cpp:4747 pthread_join(tid[1], NULL);
(gdb) n
^C
Program received signal SIGINT, Interrupt.
0x00110416in __kernel_vsyscall ()
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x08048742in thread0(void*)
at testthread.cpp:13
breakpoint already hit 1 time
2 breakpoint keep y 0x080487a4in thread1(void*)
at testthread.cpp:24
breakpoint already hit 1 time
3 breakpoint keep y 0x08048762in thread0(void*)
at testthread.cpp:154 breakpoint keep y 0x0804877ain thread0(void*)
at testthread.cpp:175 breakpoint keep y 0x080487bcin thread1(void*)
at testthread.cpp:266 breakpoint keep y 0x080487c8in thread1(void*)
at testthread.cpp:277 breakpoint keep y 0x080487e0in thread1(void*)
at testthread.cpp:298 breakpoint keep y 0x080487f5in main() at testthread.cpp:34
breakpoint already hit 1 time
9 breakpoint keep y 0x0804882ein main() at testthread.cpp:38
breakpoint already hit 1 time
10 breakpoint keep y 0x08048882in main() at testthread.cpp:44
breakpoint already hit 1 time
---Type <return> to continue, or q <return> to quit---11 breakpoint keep y 0x0804888ein main() at testthread.cpp:46
breakpoint already hit 1 time
12 breakpoint keep y 0x080488a2in main() at testthread.cpp:47
breakpoint already hit 1 time
13 breakpoint keep y 0x080488b6in main() at testthread.cpp:49
(gdb)