此程序的目标是复制用户输入单词的字符串,并使用多线程处理单词。每个线程复制每四个单词,例如第一个线程复制第一个和第五个单词,第二个复制第二个和第六个单词等等。我对互斥体做了相当多的研究,我相信我已经正确实施了互斥锁然而,当它打印时,字符串仍然显得杂乱无章。有人可以阐明为什么线程不同步吗?使用互斥锁的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',然后立即用另一个指针覆盖该指针,从而失去指向分配的唯一指针块。然而,从某种意义上说,这也是一样,因为你为一个*指针*分配了足够的空间,而似乎(误导)的意图是为指向字符串分配足够的空间。 –
另外,您的锁定是错误的。一旦每个线程获得互斥锁,它将在释放它之前执行所有*工作。互斥对于防止结果字符串被破坏是有效的,从这个意义上说,您正确使用它。但是,只有当输入中少于五个单词时才有可能获得所需的输出。 –