1
#include <pthread.h>
#include <stdio.h>
#include <math.h>
#include <stdio.h>
#include <pthread.h>
#define NO_OF_THREADS 5

void print_function(int* i)
{
 int count;
 for(count=0; count<10; count++)
  printf("Hello world from thread %d\n",*i);
 pthread_exit(NULL);
}

int main()
{
 pthread_t printThreads[NO_OF_THREADS];
 int thread_no[NO_OF_THREADS];
 int i;

 for(i=0; i<NO_OF_THREADS; i++)
 {
  thread_no[i] = i;
  pthread_create(&printThreads[i], NULL, print_function,&thread_no[i]);
 }

 int j;
 for(j=0;j<NO_OF_THREADS;j++)
  pthread_join(printThreads[j],NULL);
 puts("Main over and out");
 return 0;
}

i関数の引数としてカウンタ変数のアドレスを直接渡すだけではなく、pthread_create最初に配列の未使用スロットに割り当てられ、次に配列要素のアドレスが引数として渡されます。これはi、親スレッドと作成されたスレッドの間でアクセスする競合状態を回避するために行われます。i変数をスレッドに直接渡すとどうなるか説明してください。

4

4 に答える 4

0

呼び出しでi各スレッドにのアドレスを渡すと、各スレッドが変数でどのような値を参照するかについての保証はありません。pthread_create()スレッド 0 が 2 や 3 などの値を参照する可能性があります。これはi、 が呼び出されたときに 0 だったとしてもpthread_create()、スレッドが実行されて変数を読み取るまでに、値がメイン スレッドによって変更されているためです。

たとえば、コードを少し変更したこのバージョンでは、次のような出力が得られました。

Hello world from thread 3
Hello world from thread 4
Hello world from thread 4
Hello world from thread 3
Hello world from thread 5
Hello world from thread 5
Hello world from thread 5
...
Hello world from thread 5
Hello world from thread 5
Hello world from thread 5
Main over and out

変更されたコード:

削除され、と<math.h>の繰り返し。変数を削除しました。期待されるものと一致するようにスレッド関数のタイプを修正しました。<stdio.h><pthread.h>thread_nopthread_create()

#include <pthread.h>
#include <stdio.h>
#define NO_OF_THREADS 5

void *print_function(void *ip);
void *print_function(void *ip)
{
    int *i = ip;
    int count;
    for(count=0; count<10; count++)
        printf("Hello world from thread %d\n",*i);
    pthread_exit(NULL);
    return 0;
}

int main(void)
{
    pthread_t printThreads[NO_OF_THREADS];
    int i;

    for(i=0; i<NO_OF_THREADS; i++)
    {
        pthread_create(&printThreads[i], NULL, print_function,&i);
    }

    int j;
    for(j=0;j<NO_OF_THREADS;j++)
        pthread_join(printThreads[j],NULL);
    puts("Main over and out");
    return 0;
}

pthread_self()と同様に印刷するようにコードを修正すると*i、出力が得られました。

0x10800f000: Hello world from thread 1
0x10800f000: Hello world from thread 4
0x10800f000: Hello world from thread 5
0x10800f000: Hello world from thread 5
0x10800f000: Hello world from thread 5
0x10800f000: Hello world from thread 5
0x10800f000: Hello world from thread 5
0x10800f000: Hello world from thread 5
0x10800f000: Hello world from thread 5
0x10800f000: Hello world from thread 5
0x108092000: Hello world from thread 5
0x108115000: Hello world from thread 5
0x108198000: Hello world from thread 5
0x10821b000: Hello world from thread 5

スレッドのうち 4 つは、値 5 しか認識していません。そのうちの 1 つ (おそらく「スレッド 0」) も値 1 と 4 を認識しました。動作も非決定論的です。別の実行の開始は次のとおりです。

0x10432b000: Hello world from thread 3
0x1043ae000: Hello world from thread 4
0x104431000: Hello world from thread 4
0x1044b4000: Hello world from thread 4
0x104537000: Hello world from thread 5
0x10432b000: Hello world from thread 5
0x1043ae000: Hello world from thread 5

どちらの場合も、残りのエントリはさまざまなスレッドのエコー5でした。

于 2013-10-03T14:33:41.050 に答える
0

問題なく直接渡すことができ、その型は pthread_create で void * であるため、整数にキャストする必要があります

于 2013-10-03T11:58:21.317 に答える