まず、私はイタリア人で、私の悪い英語には申し訳ありません。
とにかく、私はこの練習をしなければならない:
"スレッドを生成するプログラムを書き込む。メインは1から9までの奇数を示し、スレッドは2から10の偶数を示している。メインとスレッドを同期させるセマフォ私はこの方法で擬似コードを書かれている」
:セマフォはCでは動作しません。なぜですか?
//semaphores
semParent = free
semChild = busy
main
generate thread "child"
for i=1 to 9 step 2
P(semParent)
print i
V(semChild)
end for
end main
child
for i=2 to 10 step 2
P(semChild)
print i
V(semParent)
end child
をそして、これは私がCで実装されている方法です。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
pthread_mutex_t semParent;
pthread_mutex_t semChild = PTHREAD_MUTEX_INITIALIZER;
void* functionChild (void* arg) {
for(int i=2; i<=10; i+=2) {
pthread_mutex_lock(&semChild);
printf("CHILD: %d\n",i);
pthread_mutex_unlock(&semParent);
}
return NULL;
}
int main(void) {
pthread_t child;
pthread_create(&child, NULL, &functionChild, NULL);
pthread_mutex_init(&semParent, NULL);
for(int i=1; i<=9; i+=2) {
pthread_mutex_lock(&semParent);
printf("PARENT : %d\n",i);
pthread_mutex_unlock(&semChild);
}
pthread_join(child, NULL);
}
しかし、出力がALWAです私はプログラムを実行するたびに異なるys。
どういうところが間違っていますか?
私はWindows 10 64ビットでCygWin64ターミナルを使用します。
ありがとうございます。
単調増加した出力値を達成するには、あるスレッドから別のスレッドに「スティック」を繰り返し渡す必要があります。条件変数を探します。 – Sergio
@Serhioなぜ問題が彼にセマフォを使用するように要求するのであれば、条件変数を使用するのでしょうか?彼の擬似コードは大丈夫です、ちょうど間違ったC言語の翻訳です。 –
@PaoloBonziniミューテックスは、バイナリセマフォ(2つのカウンタ値:1または0)として扱われることが多いため、IMOの変換はかなり合法です。ミューテックスはそのような能力を提供しないので、条件変数は待ちスレッドを "解凍"するために必要です。 – Sergio