スレッドを初心者にするだけで、これら2つのスレッドを含むタスクを実行しています。c - 2つのスレッドを共有変数と並列に実行する
#include <stdio.h>
#include <pthread.h>
int count = 0;
void waitFor(unsigned int secs)
{
unsigned int retTime = time(0) + secs;
while(time(0) < retTime);
}
void func1(void * args)
{
printf("In func1 ...\n");
long i = 0;
while(1){
i++;
if(count == 1)
break;
}
printf("The total number counted is: %ld \n", i);
count = 0;
i = 0;
}
void func2(void * args)
{
printf("In func2 ...\n");
waitFor(3);
count = 1;
}
int main()
{
pthread_t th1, th2;
int j = 0;
while(j++ < 4){
printf("\nRound:\t%d\n", j);
pthread_create(&th1, NULL, (void*)func1,NULL);
pthread_create(&th2, NULL, (void*)func2, NULL);
pthread_join(th1,NULL);
pthread_join(th2,NULL);
waitFor(3);
}
return 0;
}
私は様々な文献を読み、私の理解でpthread_join()にしましたが2つの以上のスレッドがある場合は、その後、彼らはその実行を完了するために、1つのスレッドを待ちますし、次のいずれかが実行を開始し、そうすることを意味しますに。
しかし、このプログラムを実行すると、pthread_join(th1)が実行され、両方のスレッドが作成され、同時に実行されます。これはどうですか? 出力:
Round: 1
In func2 ...
In func1 ...
The total number counted is: 897651254
Round: 2
In func1 ...
In func2 ...
The total number counted is: 1051386065
........
私の目標は、並行して、これらの2つのスレッドを実行することです。今のところ、参加はこれを行うようです。私はどこかで間違っていますか?
そして、私はvolatileを使うことはCのスレッドには好まれていないことを読んだ。だから、スレッド2から1へのシグナルとしてcountを使う方法はあるのだろうか?
1つのスレッドが実行を終了するのを待ってから、次のスレッドが実行を開始します。 Pthread_joinは、あなたが与えたスレッドが終了するのを待つだけです。 pthread_joinを呼び出したときにトレッドが作成されたと思いますか?あなたのスレッドは、pthread_createで作成および開始されました。 –
共有変数(ここでは 'count')への同時読み書きアクセスは保護する必要があります。これは通常、ミューテックスを使用して行われます。 'pthread_mutex _ *()'関数を参照してください。 – alk
@alk、func2でカウントをロックすると、func2がカウントを解除するまでfunc1全体が停止しませんか?またはfunc1の 'count'までの文が実行され、func2がロックを解除するまで待機しますか?これは並行性の権利がないことを意味しますか? – vinwin