Aula de Pthreads
Transparências da Aula (pdf)
Código de um produtor-consumidor
Páginas de manual de pthreads da Single Unix Specification (SUS)
A pthread nova do linux (NPTL, kernel 2.6+) segue essa
especificação. A maioria das páginas de manual das
máquinas é da pthread antiga LinuxThreads, que não
segue muito bem essa especificação.
FAQ de Pthreads
Um tutorial de Pthreads
Outro tutorial de pthreads - As páginas de manual desse tutorial são da LinuxThreads.
Armadilhas que acontecem com Pthreads
Descobrindo qual a pthreads do seu computador
De ldd no seu programa que vc compilou com -lpthreads:
[coutinho@theia paralelizacao]$ ldd a.out
linux-gate.so.1 => (0xffffe000)
libefence.so.0 => /usr/lib/libefence.so.0 (0xb7fd3000)
libc.so.6 => /lib/tls/libc.so.6 (0xb7e9b000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0xb7e89000)
/lib/ld-linux.so.2 (0xb7feb000)
[coutinho@theia paralelizacao]$
Execute o arquivo da libc.so.6:
[coutinho@theia paralelizacao]$ /lib/tls/libc.so.6
GNU C Library stable release version 2.3.6, by Roland McGrath et al.
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.0.4 20060507 (prerelease) (Debian 4.0.3-3).
Compiled on a Linux 2.6.13 system on 2006-06-08.
Available extensions:
GNU libio by Per Bothner
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
Native POSIX Threads Library by Ulrich Drepper et al
BIND-8.2.3-T5B
NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
Thread-local storage support included.
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
[coutinho@theia paralelizacao]$
A linha antes do BIND (em vermelho),
diz o tipo de pthreads. Nesse caso é NPTL (Native Posix
Threading Library), a pthreads nova. Um exemplo com pthreads antiga
(LinuxThreads) é:
[coutinho@dorus paralelizacao]$ /lib/libc.so.6
GNU C Library stable release version 2.3.6, by Roland McGrath et al.
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.1.2 20061028 (prerelease) (Debian 4.1.1-19).
Compiled on a Linux 2.6.18 system on 2006-11-04.
Available extensions:
GNU libio by Per Bothner
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
linuxthreads-0.10 by Xavier Leroy
BIND-8.2.3-T5B
libthread_db work sponsored by Alpha Processor Inc
NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
Thread-local storage support included.
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
Depurando seu programa em pthreads
Compile seu programa com -g.
Use o ddd, ou outro depurador gráfigo que te dê acesso ao console do gdb.
Comandos úteis:
info threads, mostra quais threads estão rodando e onde cada uma está (a thread com um * é a que vc está):
(gdb) info threads
5 Thread -1234650192 (LWP 4313) 0xb7fcf199 in __lll_mutex_lock_wait () from /lib/tls/libpthread.so.0
* 4 Thread -1226261584 (LWP 4312) thread1 (ptr=0x80560d8) at bellmanford.c:42
3 Thread -1217872976 (LWP 4311) thread1 (ptr=0x80560c8) at bellmanford.c:49
2 Thread -1209484368 (LWP 4310) thread1 (ptr=0x80560b8) at bellmanford.c:42
1 Thread -1209481536 (LWP 4096) 0xb7fc97c0 in __nptl_create_event () from /lib/tls/libpthread.so.0
(gdb)
O número após o LWP é o número do processo.
Na pthread antiga, todas as threads apareciam no ps, mas na nova
só a principal aparece:
[coutinho@theia aeds3_tp2]$ ps ux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
coutinho 449 0.0 0.1 6344 1048 ? Ss 18:52 0:00 /usr/lib/WindowMaker/WindowMaker
coutinho 2057 0.0 0.4 8196 4244 ? Rs 21:19 0:00 xterm -sl 2048
coutinho 2058 0.0 0.3 6192 3576 pts/14 Ss 21:19 0:00 bash
coutinho 4090 0.0 0.8 13236 8516 pts/14 S 21:56 0:01 ddd principal
coutinho 4092 0.0 0.3 5936 4028 pts/16 Ss+ 21:56 0:00 gdb -q -fullname principal
coutinho 4096 0.0 0.0 34428 596 pts/16 Tl 21:57 0:00 /home/speed/coutinho/grad/aeds3_tp2/principal -g entrada
coutinho 4586 0.0 0.0 2248 960 pts/14 R+ 22:57 0:00 ps ux
[coutinho@theia aeds3_tp2]$
thread 1, vai para a thread número 1 mostrada no info threads
info stack, mostra a pilha da pthread:
(gdb) info stack
#0 mybarrier (barreira=0x804aa60, myself=0) at barrier.c:40
#1 0x08048fd0 in thread1 (ptr=0x80560b8) at bellmanford.c:62
#2 0xb7fcaced in start_thread () from /lib/tls/libpthread.so.0
#3 0xb7f5edee in clone () from /lib/tls/libc.so.6
(gdb)
frame 1, quando vc está
no topo da pilha, vc está no frame #0, vc pode ir para outros
frames para ver com quais parâmetros uma função foi
chamada, o valor das variáveis locais da função
que chamou, etc.
Depurando com Electric Fence
Tutorial de Electric Fence
Para compilar seu programa com electric fence, vc tem que "linkar" ele com a biblioteca -lefence:
gcc ... -D_REENTRANT -lpthread -lefence
A electric fence vai substituir as funções malloc(),
realloc() e free(), por versões que colocam uma
proteção após a área alocada. Se vc tentar
acessar um byte após o que vc alocou, vc vai tomar SEGFAULT na
hora.
Assim: compile seu programa com electric fence, rode ele no ddd sem
colocar breakpoint e ele vai parar no momento exato que seu programa
estiver fazendo um acesso inválido. Caso ele pare dentro de uma
função da glibc, de info stack e frame X pra ver qual
função sua chamou a função que tomou
segfault.
Atenção: ás vezes o electric fence dá
SEGFAULT sozinho. Quando tomar um segfault, veja a saida do programa.
Se tiver algo tipo electric fence: internal error, o electric fence
toumou segfault sozinho.
O electric fence tem um limite para alocação de
memória (cerca de 200MB), se vc ultrapassar esse limite vai
receber uma mensagem assim:
ElectricFence Exiting: mprotect() failed: Cannot allocate memory