0

私はこのコードを持っています

私のスコープは次のとおりです。プログラムは MAX_THREAD スレッドを作成します。この場合は 3 つです。各スレッドは Thread-ID を出力して終了します。

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

#define MAX_THREAD 3

void *thr_func(void *arg);

int main(void) {
    pthread_t thr[MAX_THREAD];
    int i, thr_err;

    /* I expected three threads ... but there is only one */
    for (i=0; i<MAX_THREAD; i++) {

        printf("thread %d: - ", i);

        if ((thr_err = pthread_create(&thr[i],NULL, thr_func, NULL)) != 0) {
            fprintf(stderr, "Err. pthread_create() %s\n", strerror(thr_err));
            exit(EXIT_FAILURE);
        }

        if (pthread_join(thr[i], NULL) != 0) {
            fprintf(stderr, "Err. pthread_join() %s\n", strerror(errno));
            exit(EXIT_FAILURE);
        }
    }

    return(EXIT_SUCCESS);
}

void *thr_func(void *arg)
{
    pthread_t tid = pthread_self();
    printf("TID %lu - Address 0x%x\n", tid, (unsigned int)pthread_self());

    pthread_exit((void*)0);
}

出力は次のとおりです。

thread 0: - TID 3075976048 - Address 0xb757ab70
thread 1: - TID 3075976048 - Address 0xb757ab70
thread 2: - TID 3075976048 - Address 0xb757ab70

スレッドが 1 つしかない理由がわかりません。

私はこの宣言に疑問を持っています:

 pthread_t thr[MAX_THREAD];

3 つのスレッドの配列を作成できますか、それともこれは 1 つのスレッドだけですか????

解決した

新しいコード (pthread_joiun() を for ループの外に置いただけです)

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/syscall.h>

#define MAX_THREAD 3

void *thr_func(void *thr_num);

int main(void) {
    pthread_t thr[MAX_THREAD];
    int i, thr_err;

    for (i=0; i<MAX_THREAD; i++) {

        if ((thr_err = pthread_create(&thr[i],NULL, thr_func, (void*)i)) != 0) {
            fprintf(stderr, "Err. pthread_create() %s\n", strerror(thr_err));
            exit(EXIT_FAILURE);
        }
    }

    for (i=0; i<MAX_THREAD; i++) {
        if (pthread_join(thr[i], NULL) != 0) {
            fprintf(stderr, "Err. pthread_join() %s\n", strerror(errno));
            exit(EXIT_FAILURE);
        }
    }

    return(EXIT_SUCCESS);
}

void *thr_func(void *thr_num)
{
    pthread_t tid;

    if ((tid = syscall(SYS_gettid)) == -1) {
        fprintf(stderr, "Err. syscall() %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    printf("thread '%d' - TID %lu - Address 0x%x\n",
            (int)thr_num, tid, (unsigned int)tid);

    pthread_exit((void*)0);
}

出力は次のとおりです。

thread '1' - TID 8780 - Address 0x224c
thread '0' - TID 8779 - Address 0x224b
thread '2' - TID 8781 - Address 0x224d

アドレスとスレッド ID が異なります。

4

3 に答える 3

1

pthread_join()次のスレッドを開始する前に各スレッドを実行するため、正確に同じ TID とアドレスを取得している可能性があります。ライブラリは、関連付けられたデータ構造を再利用するのpthreadsが少し面倒なようです (おそらく効率のため)。そのため、次に生成するスレッドは、前のスレッドと同じデータ構造を使用するだけです。2 つのループを作成してみてください。1 つはスレッドを作成するためのもので、もう 1 つはpthread_join()すべてのスレッドが作成された後に s を実行するためのものです。

于 2012-11-29T17:57:47.363 に答える
0

私に飛びついた差し迫った問題の 1 つは、ループでの for (i=1; i<=MAX_THREAD; i++) の使用でした。データ構造 (pthread_t thr[MAX_THREAD]) のインデックスは 0 です。したがって、 for (i=0; i

他に壊れた様子ありません。各スレッドを (main を実行しているスレッドから) 起動し、次のスレッドの分岐に進む前に pthread_join を介してその完了をブロックしているため、コードは奇妙です。

これは、出力に毎回「thread 0:」が表示される理由を説明していません...現在のプログラムでこれが 1 から始まり、ループ内で「i」がインクリメントされると予想されます。pthread の生成と結合を行わない場合、コードは何を出力しますか? 上記のようにループ バウンドを修正した後、「スレッド 0: スレッド 1: スレッド 2:」が出力されますか?

于 2012-11-29T17:30:24.527 に答える
0

新しいスレッドを開始する前に、古いスレッドが終了しているため、新しいスレッドは同じ TID を取得していると思います。古いスレッドを維持して新しいスレッドを開いてみてください。異なる TID が返されると思います。

于 2012-11-30T07:15:26.030 に答える