2

C でマルチスレッド パフォーマンスを学習しています。サンプル コードを記述しようとしたときに、次のような問題に遭遇しました。

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>

typedef struct{
    int a;
    char b;
    } args;

void* some_func (void* arg)
{
    args *argsa = malloc(sizeof(args));
//copy the content of arg to argsa, 
//so changes to arg in main would not affect argsa
    *argsa = *(args*) arg; 
    int i = 10;
    for (; i > 0; i--)
    {
        usleep (1); //to give other threads chances to cut in
        printf ("This is from the thread %d\n", argsa->a);
    }
    free (argsa);
}
int main()

{
    pthread_t thread[3];
    args ss;
    int index = 0;
    ss.b = 's';
    for (; index <3 ; index++)
    {
        ss.a = index;
        if (pthread_create (thread+index, NULL, some_func, (void*)&ss ))
        {
            usleep(10);
            printf ("something is wrong creating the thread"); 
        }
    }
        pthread_join ( thread[0], NULL);
        pthread_join ( thread[1], NULL);
        pthread_join ( thread[2], NULL);
    return 0;
}

構造体の char b が役に立たないことはわかっていますが、構造体を渡す練習をしたいだけです。コードが「これはスレッド x からのものです」と出力することを期待しています。ここで、x は 0、1、または 2 です。ただし、コードでは現在、「これはスレッド 2 からのものです」と 30 回しか表示されません。何か問題があると思います

*argsa = *(args*) arg; 

しかし、これを解決して目的の出力を得る方法が見つかりません。

どんな助けでも大歓迎です!

4

3 に答える 3

3

すべてのスレッドに同じポインターを渡しているためです。スレッド 0 が開始するまでに、ss.a の値を 1 (さらに 2) にインクリメントしています。

これはもう少し正しいです:

void* some_func (void* arg)
{
    args *argsa = (args*)arg;
    int i;
    for (i = 0; i < 10; i++)
    {
        usleep (1); //to give other threads chances to cut in
        printf ("This is from the thread %d\n", argsa->a);
    }
}
int main()
{
    pthread_t thread[3];
    args ss[3];
    int index;
    for (index = 0; index < 3; index++)
    {
        ss[index].a = index;

        if (pthread_create(&thread[index], NULL, some_func, &ss[index] ))
        {
            printf ("something is wrong creating the thread"); 
        }
    }
    pthread_join ( thread[0], NULL);
    pthread_join ( thread[1], NULL);
    pthread_join ( thread[2], NULL);
    return 0;
}
于 2012-06-02T21:06:07.337 に答える
2

この種の問題を解決するために使用するパターンは次のとおりです。

  1. スレッドに渡すパラメーターを保持する構造を作成します。

  2. このような構造体を で割り当てmallocます。

  3. 構造を埋めます。

  4. 構造体へのポインターをスレッドに渡します。

  5. スレッドが構造体の処理を完了すると、スレッドは構造体を解放します。

これは、スレッドから情報を取得する必要がないことを前提としています。その場合、スレッドを結合するコードが構造を解放するように変更できます。これにより、構造が応答を保持することもできます。スレッドに参加し、応答情報を読み取り、構造を解放します。

新しく作成されたスレッドが存在する間、それが構造に触れる唯一のスレッドであるため、特別なロックや同期は必要ありません。

于 2012-06-03T02:03:13.260 に答える