2016-10-10 6 views
-2

スレッドを同期化しようとすると問題が発生しました。Cでスレッドを同期できません

static void* CarProcess(void *str); 

int main() 
{ 
    thread_t *pthreadsArray; 
    pthreadsArray = (thread_t*)malloc(sizeof(thread_t) * 10); 

    for (int i = 0; i < 10; i++) 
    { 
     int pthread = mythread_create(&pthreadsArray[i], NULL, CarProcess, i); 
    } 
    for (int i = 0; i < 10; i++) 
    { 
     mythread_join(pthreadsArray[i], NULL); 
    } 
} 

static void* CarProcess(void *str) 
{ 
    while(1){ 
     printf("Thread ID: %i\n", str); 
    } 
} 

私はプログラムを実行すると、私はこの出力があります:

Thread ID: 0 
Thread ID: 0 
Thread ID: 0 
Thread ID: 0 
... 

をしかし、 "スレッドID:1" と表示されたことがない、 "スレッドID:2"、「スレッドを私は次のコードを持っていますID:3 "....または"スレッドID:9 "。私はそれがミューテックスを使用して解決することができたと思うミューテックスをロックしてunloking ..どのような体はそれを解決するためのアイデアを持っていますか?ありがとう

+0

、実際のプログラムには動的なスレッド数があると仮定しています。それ以外の場合は 'malloc'を使うだけで済みますし、通常の配列を使うこともできます。 –

+0

また、 'mythread_create'と' mythread_join'とは何ですか? –

+0

@JoachimPileborgありがとうございますが、あなたはスレッドについてたくさん知っているようです...作成と結合はスレッドライブラリの関数です。 –

答えて

2

strは実際にはintではありません。いくつかのキャストを行う必要があります(スレッドの作成時と引数の取得時の両方)。

スレッドを作成し、整数を適切に渡すには、最初にintptr_tに値をキャストする必要があります。standard integer typeは、整数またはポインタの両方に適しています。あなたが逆の鋳造を行う必要があるスレッド関数の内部で整数値を取得するためにその後

pthread_create(&pthreadsArray[i], NULL, CarProcess, (void *) (intptr_t) i); 

:その後、汎用ポインタ(すなわちvoid *)にキャストする必要があり、あなたの質問に関係のない

static void* CarProcess(void *str) 
{ 
    int i = (int) (intptr_t) str; 
    printf("Thread ID: %i\n", i); 
} 
+0

ありがとうございます。問題は可変キャスティングではありません。スレッドを同期しています。私はマルチスレッドが必要です。 –

+2

@ArturoSalasコードが正確に表示されているものであれば、同期は必要ありません。いずれのスレッドも共有データにアクセスしません。同期は、あるスレッドが別のスレッドを読み取っている間に変更する方法で共有データにアクセスする場合にのみ必要です。 –

+0

これは、最初のスレッドからのメッセージを印刷するだけで、他の9スレッドではありません。これはマルチスレッドではありません。 –

関連する問題