2016-08-02 26 views
1


まず、私はイタリア人で、私の悪い英語には申し訳ありません。
とにかく、私はこの練習をしなければならない:
"スレッドを生成するプログラムを書き込む。メインは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ターミナルを使用します。
ありがとうございます。

+0

単調増加した出力値を達成するには、あるスレッドから別のスレッドに「スティック」を繰り返し渡す必要があります。条件変数を探します。 – Sergio

+0

@Serhioなぜ問題が彼にセマフォを使用するように要求するのであれば、条件変数を使用するのでしょうか?彼の擬似コードは大丈夫です、ちょうど間違ったC言語の翻訳です。 –

+0

@PaoloBonziniミューテックスは、バイナリセマフォ(2つのカウンタ値:1または0)として扱われることが多いため、IMOの変換はかなり合法です。ミューテックスはそのような能力を提供しないので、条件変数は待ちスレッドを "解凍"するために必要です。 – Sergio

答えて

-1

NULL属性のあるpthread_mutex_init(&semParent, NULL)PTHREAD_MUTEX_INITIALIZERの両方がロックされていてロックされていないという同じ効果があると思います。あなたの問題には、厳密な意味を持つ重要なセクションはありません。したがって、@Serhioが言及したように、より良い解決策は条件変数となるはずです。より大きな自由を与えるセマフォhttp://www.csc.villanova.edu/~mdamian/threads/posixsem.htmlをチェックアウトすることもできますし、mutexの機能も持つことができます。

1

pthread_mutex_tはセマフォーではありません(セマフォーは "V"を "フリー"に初期化する場合は、ミューテックスとして使用できます)。セマフォAPIはsem_init,sem_postおよびsem_waitです。

別のスレッドによってロックされたmutexでpthread_mutex_unlockを使用すると、プログラムによって未定義の動作がトリガされます。

+0

'sem _ *()'ファミリはpthread APIではなく、プロセス間通信用に設計されています。 – Sergio

+0

@Serhio [semaphore.h'で提供されている]関数(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/semaphore.h.html)は、インターと*イントラ*プロセス通信用に設計されています、[ドキュメント](http://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_init.html)に記載されています。それらはここでの使用には非常に適しています。 –

+0

@AndrewHenleああ、悪いです。ありがとう! – Sergio

0

これは問題が発生していない可能性がありますが、マルチスレッドプログラムではprintf()を使用しないでください。 printf()はバッファに書き込みを行い、すぐに画面に出力するとは限りません。代わりに、sprintf()を使用して次のように記述してください:

関連する問題