Ik heb een programma dat meerdere threads gebruikt, maar dmv. mutexen wordt er voor gezorgt dat er maar 1 thread tegelijk actief is (dat klinkt onzinnig, dat weet ik, maar dat is niet onzinnig, alleen gaat het te ver om dat hier uit te leggen
).
Threads staan dus vaak op een mutex te wachten, en als ik dan een thread die op een mutex wacht afsluit dmv pthread_cancel, en ik gebruik nadien die mutex weer voor een nieuwe thread, dan komt het systeem in een deadlock toestand (denk ik: 0% cpu gebruik, en m'n programma draait nog wel maar doet niks). Een versimpeld voorbeeld:
Als ik dit run is 'main: cancel(task)=0' van regel 34 het laatste wat er op het scherm verschijnt. De task (== thread) is wel gemaakt, dus het is de functie 'pthread_mutex_lock' die niet mee werkt.
Ik het dit getest op Redhat Linux 7.2 (met 2.4.20 kernel en g++ 2.96), Redhad 9 (met 2.4.2? kernel met NPTL en gcc 2.96), Knoppix 3.3 (Linux kernel 2.4.22 met g++ 3.2), en HPUX 11 (met aCC A.03.35), en die geven allen hetzefde resultaat. Als ik het echter op een Linux kernel 2.6.0test10 met g++ 3.2 probeer, dan werkt het wel! Ik weet dat deze nieuwe kernel NPTL heeft ipv. LinuxThreads, dus de hele implementatie is op nieuw gedaan.
Dus dat dit programma wel werkt met NPTL, wijst dat op een bug in NPTL of in en oude pthreads implementatie (wat dus ook fout zou zijn op HP Unix). Of is dat de interpretatie ruimte die de specs open laten?
Maar de hamvraag is eigenlijk: hoe krijg ik dit aan de praat op alle genoemde systemen? (al is RH7.2 de belangrijkste) Dingen als 'kernel en compiler upgraden' zijn geen optie, dit zijn bedrijfscomputers waar ik niet aan kan zitten: ik bedoel dus wijzigingen in de code
.
Threads staan dus vaak op een mutex te wachten, en als ik dan een thread die op een mutex wacht afsluit dmv pthread_cancel, en ik gebruik nadien die mutex weer voor een nieuwe thread, dan komt het systeem in een deadlock toestand (denk ik: 0% cpu gebruik, en m'n programma draait nog wel maar doet niks). Een versimpeld voorbeeld:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| #include <pthread.h> #include <iostream.h> #include <stdlib.h> #include <unistd.h> using namespace std; static pthread_mutex_t mutex; static pthread_cond_t main_cond; static pthread_cond_t task_cond; static pthread_t task_thread; static void* task_body(void* arg) { cout << "task: entern"; cout << "task: mutex_lock=" << pthread_mutex_lock(&mutex) << endl; cout << "task: cond_signal(main)=" << pthread_cond_signal(&main_cond) << endl; cout << "task: cond_wait=" << pthread_cond_wait(&task_cond,&mutex) << endl; cout << "task: exitn"; return 0; } int main() { cout << "main: enter" << endl; cout << "main: mutex_init=" << pthread_mutex_init(&mutex,0) << endl; cout << "main: mutex_lock=" << pthread_mutex_lock(&mutex) << endl; cout << "main: cond_init(main)=" << pthread_cond_init(&main_cond,0) << endl; cout << "main: cond_init(task)=" << pthread_cond_init(&task_cond,0) << endl; //first thread creation: cout << "main: create=" << pthread_create(&task_thread,0,task_body,0) << endl; cout << "main: cond_wait=" << pthread_cond_wait(&main_cond,&mutex) << endl; cout << "main: cancel(task)=" << pthread_cancel(task_thread) << endl; cout << "main: mutex_lock=" << pthread_mutex_lock(&mutex) << endl; //second thread creation: cout << "main: create=" << pthread_create(&task_thread,0,task_body,0) << endl; cout << "main: cond_wait=" << pthread_cond_wait(&main_cond,&mutex) << endl; cout << "main: exitn"; } |
Als ik dit run is 'main: cancel(task)=0' van regel 34 het laatste wat er op het scherm verschijnt. De task (== thread) is wel gemaakt, dus het is de functie 'pthread_mutex_lock' die niet mee werkt.
Ik het dit getest op Redhat Linux 7.2 (met 2.4.20 kernel en g++ 2.96), Redhad 9 (met 2.4.2? kernel met NPTL en gcc 2.96), Knoppix 3.3 (Linux kernel 2.4.22 met g++ 3.2), en HPUX 11 (met aCC A.03.35), en die geven allen hetzefde resultaat. Als ik het echter op een Linux kernel 2.6.0test10 met g++ 3.2 probeer, dan werkt het wel! Ik weet dat deze nieuwe kernel NPTL heeft ipv. LinuxThreads, dus de hele implementatie is op nieuw gedaan.
Dus dat dit programma wel werkt met NPTL, wijst dat op een bug in NPTL of in en oude pthreads implementatie (wat dus ook fout zou zijn op HP Unix). Of is dat de interpretatie ruimte die de specs open laten?
Maar de hamvraag is eigenlijk: hoe krijg ik dit aan de praat op alle genoemde systemen? (al is RH7.2 de belangrijkste) Dingen als 'kernel en compiler upgraden' zijn geen optie, dit zijn bedrijfscomputers waar ik niet aan kan zitten: ik bedoel dus wijzigingen in de code
[ Voor 12% gewijzigd door ajvdvegt op 04-12-2003 11:48 . Reden: Nu in kleur! ]
I don't kill flies, but I like to mess with their minds. I hold them above globes. They freak out and yell "Whooa, I'm *way* too high." -- Bruce Baum