1. 程式人生 > >6、一個 pthread_cancel 引起的執行緒死鎖【整理轉載】

6、一個 pthread_cancel 引起的執行緒死鎖【整理轉載】

[Thread debugging using libthread_db enabled]

Breakpoint 8, main () at testthread.cpp:34
34        if (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:38
38
if (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:13 13 pthread_cond_wait(&cond, &mutex); (gdb) n [New Thread 0xb77ebb70 (LWP 2495)] in
main thread tag 1 [Switching to Thread 0xb7fee6d0 (LWP 2491)] Breakpoint 10, main () at testthread.cpp:44 44 pthread_cancel(tid[0]); (gdb) n in thread 1 tag 1 Breakpoint 11, main () at testthread.cpp:46 46 pthread_join(tid[0], NULL); (gdb) n [Switching to Thread 0xb77ebb70 (LWP 2495)] Breakpoint 2
, thread1 (arg=0x0) at testthread.cpp:24 24 pthread_mutex_lock(&mutex); (gdb) n [Thread 0xb7fecb70 (LWP 2494) exited] [Switching to Thread 0xb7fee6d0 (LWP 2491)] Breakpoint 12, main () at testthread.cpp:47 47 pthread_join(tid[1], NULL); (gdb) n ^C Program received signal SIGINT, Interrupt. 0x00110416 in __kernel_vsyscall () (gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0x08048742 in thread0(void*) at testthread.cpp:13 breakpoint already hit 1 time 2 breakpoint keep y 0x080487a4 in thread1(void*) at testthread.cpp:24 breakpoint already hit 1 time 3 breakpoint keep y 0x08048762 in thread0(void*) at testthread.cpp:15 4 breakpoint keep y 0x0804877a in thread0(void*) at testthread.cpp:17 5 breakpoint keep y 0x080487bc in thread1(void*) at testthread.cpp:26 6 breakpoint keep y 0x080487c8 in thread1(void*) at testthread.cpp:27 7 breakpoint keep y 0x080487e0 in thread1(void*) at testthread.cpp:29 8 breakpoint keep y 0x080487f5 in main() at testthread.cpp:34 breakpoint already hit 1 time 9 breakpoint keep y 0x0804882e in main() at testthread.cpp:38 breakpoint already hit 1 time 10 breakpoint keep y 0x08048882 in main() at testthread.cpp:44 breakpoint already hit 1 time ---Type <return> to continue, or q <return> to quit--- 11 breakpoint keep y 0x0804888e in main() at testthread.cpp:46 breakpoint already hit 1 time 12 breakpoint keep y 0x080488a2 in main() at testthread.cpp:47 breakpoint already hit 1 time 13 breakpoint keep y 0x080488b6 in main() at testthread.cpp:49 (gdb)