我試圖爲2個線程實現pthread_cond_wait
。我的測試代碼試圖用兩個線程瓶坯以下情形:2線程的pthread_cond_wait
- 線程B等待條件
- 線程A打印「Hello」五次
- 線程A信號線程B
- 線程A等待
- 線程B打印 「再見」
- 線程B信號線程A
- 迴路,開始(X5)
到目前爲止,代碼打印出「Hello」五次然後卡住了。從例子我看似乎我是在正確的軌道上「鎖定互斥,等待,得到由另一個線程發出信號,解除互斥體,做的東西,循環」
測試代碼:
//Import
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
//global variables
pthread_cond_t condA = PTHREAD_COND_INITIALIZER;
pthread_cond_t condB = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *threadA()
{
int i = 0, rValue, loopNum;
while(i<5)
{
//unlock mutex
rValue = pthread_mutex_unlock(&mutex);
//do stuff
for(loopNum = 1; loopNum <= 5; loopNum++)
printf("Hello %d\n", loopNum);
//signal condition of thread b
rValue = pthread_cond_signal(&condB);
//lock mutex
rValue = pthread_mutex_lock(&mutex);
//wait for turn
while(pthread_cond_wait(&condA, &mutex) != 0)
i++;
}
}
void *threadB()
{
int n = 0, rValue;
while(n<5)
{
//lock mutex
rValue = pthread_mutex_lock(&mutex);
//wait for turn
while(pthread_cond_wait(&condB, &mutex) != 0)
//unlock mutex
rValue = pthread_mutex_unlock(&mutex);
//do stuff
printf("Goodbye");
//signal condition a
rValue = pthread_cond_signal(&condA);
n++;
}
}
int main(int argc, char *argv[])
{
//create our threads
pthread_t a, b;
pthread_create(&a, NULL, threadA, NULL);
pthread_create(&b, NULL, threadB, NULL);
pthread_join(a, NULL);
pthread_join(b,NULL);
}
一個指針在正確的方向將不勝感激,謝謝! (在Linux上使用「gcc timeTest.c -o timeTest -lpthread」編譯的代碼)
不,這是不需要的,我主要是嘗試變化,但正如你所說,這將是理想的只使用一個 –