このプログラムの目的は、マルチスレッドを使用して、単語のユーザー入力ワードで取り込まれた文字列をコピーすることです。各スレッドは4番目の単語をすべてコピーするので、最初のスレッドは1番目と5番目の単語をコピーし、2番目は2番目と6番目の単語をコピーします。私はmutexに関する研究をかなり行いました。しかし、文字列はまだ印刷されたときに混乱したナンセンスとして現れます。誰かがスレッドが同期していない理由についていくつかの光を当てることができますか?mutexを使った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'に代入し、直ちにそのポインタを別のものに上書きして、割り当てられたポインタブロック。しかし、あなたは1つのポインタ*に十分なスペースを割り当てているので、ある意味ではそうですが、(間違った)意図はポインティングされた文字列に十分なスペースを割り当てることだったようです。 –
また、ロックが間違っています。それぞれのスレッドがmutexを取得すると、それを解放する前にそのすべての作業を実行します。ミューテックスは、結果の文字列が壊れるのを防ぐのに効果的です。その意味では、正しく使用しています。しかし、入力に5単語未満がある場合にのみ、望ましい出力を得る機会があります。 –