Betrachten Sie das nächste Stück Code -seltsam pthread_mutex_t Verhalten
#include <iostream>
using namespace std;
int sharedIndex = 10;
pthread_mutex_t mutex;
void* foo(void* arg)
{
while(sharedIndex >= 0)
{
pthread_mutex_lock(&mutex);
cout << sharedIndex << endl;
sharedIndex--;
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t p1;
pthread_t p2;
pthread_t p3;
pthread_create(&p1, NULL, foo, NULL);
pthread_create(&p2, NULL, foo, NULL);
pthread_create(&p3, NULL, foo, NULL);
pthread_join(p1, NULL);
pthread_join(p2, NULL);
pthread_join(p3, NULL);
return 0;
}
ich einfach drei erstellt pthreads
und gab ihnen alle die gleiche Funktion foo
, in der Hoffnung, dass jeder Faden, um seinerseits druckt und verringert die sharedIndex
.
Aber das ist der Ausgang -
10
9
8
7
6
5
4
3
2
1
0
-1
-2
- Ich verstehe nicht, warum der Prozess stoppt nicht, wenn
sharedIndex
0 erreicht sharedIndex
durch einemutex
geschützt ist. Wie kommt es, nachdem es 0 wurde? Müssen die Threads nicht direkt zureturn NULL;
springen?
EDIT
Darüber hinaus scheint es, dass nur der erste Thread die sharedIndex
dekrementiert. Warum verringert nicht jeder Thread die freigegebene Ressource, wenn sie an der Reihe ist? Hier ist der Ausgang nach einem fix -
Current thread: 140594495477504
10
Current thread: 140594495477504
9
Current thread: 140594495477504
8
Current thread: 140594495477504
7
Current thread: 140594495477504
6
Current thread: 140594495477504
5
Current thread: 140594495477504
4
Current thread: 140594495477504
3
Current thread: 140594495477504
2
Current thread: 140594495477504
1
Current thread: 140594495477504
0
Current thread: 140594495477504
Current thread: 140594478692096
Current thread: 140594487084800
Ich wünsche, dass alle von dem Thread werden die gemeinsame Quelle verringern - das heißt, jeder contex Schalter, ein anderer Thread auf die Ressource zugreifen und nicht sein Ding.
versuchen Sie, 'pthread_mutex_init' vor dem Erstellen von Threads aufzurufen und' pthread_mutex_destroy' am Ende des Programms – mausik
Warum versuchen Sie nicht, das undefinierte Verhalten in Ihrem Code zu beheben und sehen, ob es hilft? –
Ich habe den Code geändert und es hat funktioniert. Aber immer noch - nur ein einziger Thread dekrementiert die Ressource –