私は2つのスレッドを作成するプログラムを作成しています。各スレッドは、各行に1つの文字を含む1つのテキストファイルを読み込みます。第二のようにフォーマットされPthreadの同期化:2つのテキストファイルの逆順読み込み
h
0
h
0
...
:
0
i
0
i
0
i
時にはお互いの後にお互いの後に複数の文字、または複数のゼロが存在することができる
まずようにフォーマットされます。しかし、1つのファイルの1行に文字がある場合、2番目のファイルの対応する行は0になり、その逆も同様です。
スレッドは、ゼロに達するまで、ファイル入力をグローバルchar配列に読み込み続けることになっています。この時点で、他のスレッドが引き継ぐことができます。そして、両方のファイルが完全に読み込まれるまで、彼らは前進し続けます。
この時点で、私は(1)多くのhの後に多くのiまたは(2)(の正解)のヒヒの連続ストリーム、続いて多くのhが続きます。だから、私は自分の同期方法がオフであることを知っています。ここで
は私のスレッドの1の例である:
int main(void)
{
pthread_t id1;
pthread_t id2;
pthread_create((&id1), NULL, getMessage1, NULL);
pthread_create((&id2), NULL, getMessage2, NULL);
pthread_join(id1, NULL);
pthread_join(id2, NULL);
int j;
for (j = 0; j < 1001; j++)
{
printf ("%c ",message[j]);
}
return 0;
}
:ここ (。両方のスレッドが開かれているファイルを除いて、まったく同じであることに注意してください) void *getMessage1()
{
FILE *studentOne = fopen("Student1", "r");
size_t howManyChars;
char *placeHolderChars;
int count = 1;
while (count < 501)
{
placeHolderChars = NULL;
getline(&placeHolderChars, &howManyChars, studentOne);
if(strcmp(placeHolderChars, "0\n") == 0) //if we've reached a zero
{
pthread_mutex_unlock(&lock);
}
else
{ while(1)
{
if(pthread_mutex_trylock(&lock) == 0)
{
break;
}
}
if(strlen(placeHolderChars)>0)
{
placeHolderChars[1] = '\0';
}
strcat(message,placeHolderChars);
}
free(placeHolderChars);
if(feof(studentOne))
{
pthread_mutex_unlock(&lock); //unlock
fclose(studentOne);
break;
}
count++;
}
return 0;
}
は私の主な方法であり、
ロック、アンロック、待機、および/または信号を使用して、一貫性のある結果が得られる同期同期テクニックを作成する方法についてのガイダンスをお寄せいただきありがとうございます。
セマフォ。あなたはミューテックスでこれを行うことはできません。マルチデュープ。 –
私の教授は実際にmutexを使うことを提案しました。だから、私はミューテックスをスクラップし、バイナリセマフォまたは何かを使用する必要がありますか? – Selena
また、両方のスレッドが使用する1つの機能しか持たないと考えるべきですか? (そして、ファイルをパラメータとして渡しますか?)それで何か違いはありますか? – Selena