此程序的目標是複製用戶輸入單詞的字符串,並使用多線程處理單詞。每個線程複製每四個單詞,例如第一個線程複製第一個和第五個單詞,第二個複製第二個和第六個單詞等等。我對互斥體做了相當多的研究,我相信我已經正確實施了互斥鎖然而,當它打印時,字符串仍然顯得雜亂無章。有人可以闡明爲什麼線程不同步嗎?使用互斥鎖的Pthread同步不能正確同步單詞
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
void *processString(void *);
char msg1[100];
char msg2[100];
char * reg;
char * token;
char * tokens[10];
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t = PTHREAD_COND_INITIALIZER;
int main(){
int i = 0, j;
pthread_t workers[4];
printf("Please input a string of words separated by whitespace characters: \n");
scanf("%99[^\n]", msg1); //take in a full string including whitespace characters
//tokenize string into individual words
token = strtok(msg1, " ");
while(token != NULL){
tokens[i] = (char *) malloc (sizeof(token));
tokens[i] = token;
token = strtok(NULL, " ");
i++;
}
for(j = 0; j < 4; j++){
if(pthread_create(&workers[j], NULL, processString, (void *) j))
printf("Error creating pthreads");
}
for(i = 0; i < 4; i++){
pthread_join(workers[i], NULL);
}
pthread_mutex_destroy(&lock);
printf("%s\n", msg2);
return 0;
}
//each thread copies every fourth word
void *processString(void *ptr){
int j = (int) ptr, i = 0;
pthread_mutex_lock(&lock);
while(tokens[i * 4 + j] != NULL){
reg = (char *) malloc (sizeof(tokens[i * 4 + j]));
reg = tokens[i * 4 + j];
strcat(msg2, reg);
strcat(msg2, " ");
i++;
}
pthread_mutex_unlock(&lock);
return NULL;
}
如果你想控制線程的運行順序,你需要類似條件變量或信號量的東西。互斥體只確保相互排斥,而不是排序。 – EOF
什麼EOF說。但是,你的代碼也會泄漏內存。在其循環的每次迭代中,函數'processString()'分配一塊內存,將指向該塊的指針賦值給變量'reg',然後立即用另一個指針覆蓋該指針,從而失去指向分配的唯一指針塊。然而,從某種意義上說,這也是一樣,因爲你爲一個*指針*分配了足夠的空間,而似乎(誤導)的意圖是爲指向字符串分配足夠的空間。 –
另外,您的鎖定是錯誤的。一旦每個線程獲得互斥鎖,它將在釋放它之前執行所有*工作。互斥對於防止結果字符串被破壞是有效的,從這個意義上說,您正確使用它。但是,只有當輸入中少於五個單詞時纔有可能獲得所需的輸出。 –