我想了解有關線程和鎖定,並編寫了一個程序,以使用兩個線程分別打印偶數和奇數的序列來打印數字。但似乎進入了僵局。有人能告訴我我做錯了什麼嗎?試圖在C中使用線程順序打印數字
/*
threads printing even odd number without shared variable
*/
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mux = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t even = PTHREAD_COND_INITIALIZER;
pthread_cond_t odd = PTHREAD_COND_INITIALIZER;
void print_even()
{
int i = 0;
do {
pthread_mutex_lock(&mux);
pthread_cond_wait(&odd, &mux);
i+=2;
printf("%d ", i);
pthread_cond_signal(&even);
pthread_mutex_unlock(&mux);
} while (i<100);
}
void print_odd()
{
int i = 1;
do {
pthread_mutex_lock(&mux);
pthread_cond_wait(&even, &mux);
i+=2;
printf("%d ", i);
pthread_cond_signal(&odd);
pthread_mutex_unlock(&mux);
} while (i<100);
}
int main()
{
pthread_t podd, peven;
pthread_mutex_init(&mux, NULL);
printf("The values are:\n");
pthread_create(&podd, NULL, (void *)&print_odd, NULL);
pthread_create(&peven, NULL, (void *)&print_even, NULL);
pthread_mutex_lock(&mux);
pthread_cond_signal(&even);
pthread_mutex_unlock(&mux);
pthread_join(podd, NULL);
pthread_join(peven, NULL);
printf("\ndone\n");
return 0;
}
線程的要點在於,除非試圖訪問由它們共享的數據,否則它們可以彼此免費,這取決於誰先到達並確保數據一致。爲什麼翻轉和翻牌? –
當沒有人在等待時,你發出信號。不管怎樣,'print_even'和'print_odd'需要在'main'發送第一個信號之前發信號通知'main'它們已準備就緒(即鎖定它們各自的互斥鎖)。所以你需要三個互斥體,每個互斥體用於'main','print_odd'和'print_even',以及兩個線程用來發信號給main的另一個條件變量。 – user3386109
@ user3386109啊,是的。由於信號在任何人等待之前發送得太早,所以基本上已經丟失。感謝您的回答。 – themoreyouknow