考慮下一個代碼塊 -怪異pthread_mutex_t行爲
#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;
}
我只是創建了三個pthreads
並給他們所有相同功能foo
,在此希望每個線程,在其反過來,將打印和遞減sharedIndex
。
但這是輸出 -
10
9
8
7
6
5
4
3
2
1
0
-1
-2
- 我不明白爲什麼當
sharedIndex
達到0 sharedIndex
由mutex
保護的進程不會停止。在它變成0之後它是如何訪問的?線程是不是應該直接跳至return NULL;
?
編輯
此外,似乎只有第一個線程遞減sharedIndex
。 爲什麼不是每個線程都在遞減共享資源? 這裏有一個修正後的輸出 -
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
我希望所有的線程將遞減共享源代碼 - 這意味着,每一個開關CONTEX,不同的線程將訪問資源,做它的事。
嘗試在程序的最後創建線程和「pthread_mutex_destroy」之前調用'pthread_mutex_init' – mausik
爲什麼不嘗試在代碼中修復未定義的行爲並查看它是否有幫助? –
我確實改變了代碼,它工作。但仍然 - 只有一個線程遞減資源 –