2016-06-26 7 views
1

スレッドを初心者にするだけで、これら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を使う方法はあるのだろうか?

+0

1つのスレッドが実行を終了するのを待ってから、次のスレッドが実行を開始します。 Pthread_joinは、あなたが与えたスレッドが終了するのを待つだけです。 pthread_joinを呼び出したときにトレッドが作成されたと思いますか?あなたのスレッドは、pthread_createで作成および開始されました。 –

+3

共有変数(ここでは 'count')への同時読み書きアクセスは保護する必要があります。これは通常、ミューテックスを使用して行われます。 'pthread_mutex _ *()'関数を参照してください。 – alk

+0

@alk、func2でカウントをロックすると、func2がカウントを解除するまでfunc1全体が停止しませんか?またはfunc1の 'count'までの文が実行され、func2がロックを解除するまで待機しますか?これは並行性の権利がないことを意味しますか? – vinwin

答えて

2

引用:

私の理解でpthread_join()が2以上のスレッドがある場合は、その後、彼らはその実行を完了するために、1つのスレッドを待ちますし、次のいずれかが実行されるので、

に開始することを意味します

これは間違っています。 Joinとは、スレッドが終了するまでプロセスが待機することを意味します。

引用: '同時に'

モーメントpthread_joinを(TH1)は、実行され、両方のスレッドが作成され、実行されます。

これは間違っています。スレッドは作成され、pthread_createを呼び出すときに開始されます。注:によって開始私は彼らが実行する準備ができていることを意味します。ただし、実際に実行するタイミングを決めるのはOSなので、実行するまでに時間がかかることがあります。

2つのスレッド間でcountを共有するには、ミューテックスを使用できます。

int count = 0; 
pthread_mutex_t lock; 

countにアクセスする場合は、あなたが最初に、mutexをロック読み/変数を書いて、ミューテックスのロックを解除する必要があります。

例:

pthread_mutex_lock(&lock); 
count = 1; 
pthread_mutex_unlock(&lock); 

例:

pthread_mutex_lock(&lock); 
if(count == 1) 
{ 
    pthread_mutex_unlock(&lock); 
    break; 
} 
pthread_mutex_unlock(&lock); 

そしてmainにあなたのようなミューテックスを初期化する必要があります:

2がある場合は、」読みました
pthread_mutex_init(&lock,NULL); 
+0

私はスレッドが 'pthread_create'を行う瞬間の実行を開始していることを知っています。これは並列的な排除を意味しますか?そして、私が 'pthread_join'なしで試してみると、私のスレッド2は起動しません。どうして? – vinwin

+0

@infoseeker - はい、並行して。しかし、並列の意味はシステムによって異なる場合があります。シンプルなシングルコアCPUは時分割を使用するだけで、マルチコアCPUはスレッドを本当に並行して実行できます。 – 4386427

+1

@infoseeker引用: ''pthread_join'なしで、私のスレッド2は起動しません。なぜ?あなたのシステムについての詳細を知らないとわかりません。 'スレッド'が実際に実行される前に 'main'が完了したと推測できます。いずれにせよ、スレッドが終了するのを待つ必要があるので、joinが必要です – 4386427

関連する問題