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

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

複製程式碼
[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 Thread
0xb7fee6d0 (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)
複製程式碼