4

並列スレッドを作成したい。例: 私の出力は次のようになります: スレッド 1 スレッド 3 スレッド 4 スレッド 2...

pthread_t tid;
int n=4;
int i;
for(i=n;i>0;i--){
    if(pthread_create(&tid,NULL,thread_routine,&i)){
        perror("ERROR");
    }
    pthread_join(tid,NULL);
}

そして私の機能(ルーチン)は次のとおりです。

void *thread_routine(void* args){
    pthread_mutex_lock(&some);
    int *p=(int*) args;
    printf("thread%d ",*p);
    pthread_mutex_unlock(&some);
}

私は常に並列ではない結果を得ました:スレッド1スレッド2スレッド3スレッド4。このスレッドを同時に実行したい - 並列。問題は pthread_join の位置かもしれませんが、どうすれば修正できますか?

4

2 に答える 2

4

すべてのスレッドを開始した後で、スレッドに参加したいと考えています。コードが現在行っていることは、スレッドを開始してから参加し、次のスレッドを開始することです。これは基本的に、それらを順次実行するだけです。

ただし、どちらのスレッドが最初にロックに到達したかのみに基づいて出力が変化するため、出力は変化しない可能性があります。

于 2014-12-16T16:04:59.880 に答える
0

はい、作成されたばかりのスレッドが終了するまでメインスレッドが他のスレッドを作成し続けることをブロックしているため、結合はスレッドの同時実行を妨げています。結合を削除すると、同時に実行されるはずです。(ただし、システムによってはまだ並列化されていない可能性があります。)

ただし、出力に違いが見られない場合があります。

于 2014-12-16T16:05:06.523 に答える