0

いくつかの計算などを行い、いくつかのスレッドを起動するために pthreads を使用するプログラムがあります。これはうまくいきます。

ただし、ベンチマーク タイプのものについては、同じスレッドのセットを数回起動する必要があります。それらを 2 回目に起動すると、segfault (コア ダンプ) が発生します。

選択したコード:

Pastebin の代替 (最初のミューテックス行がありません) 問題に関連するものを含める必要があります: http://pastebin.com/5iUsy8L2

function()
{
pthread_mutex_t pmutex;
for (int k = 0; k < 10; k++)
{
    pthread_mutex_lock (&pmutex);

    pthread_t pthreads[CPUTHRDS];
    launch_threads(pthreads);

    /* Unlock and start timer */
    pthread_mutex_unlock (&pmutex);
    tot_time = -msecond();

    /* Join taskthreads when they are done */
    join_threads(pthreads);
    tot_time += msecond();

    //<do something>
}
}

void launch_threads(pthread_t *pthreads)
{
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

printf("#HOST# Starting Task Threads\n");    

/* Launch the CPU threads */
for (int i = 0; i < CPUTHRDS; i++)
{
    fprintf(stderr, "launchthread %d\n", i);
    int rc = pthread_create(&pthreads[i], &attr, cpu_thread, NULL);
    if (rc) {
        printf("ERROR; return code from pthread_create() is %d\n", rc);
        exit(-1);
    }
}
printf("#HOST# CPU-Threads started: %d\n", CPUTHRDS);

pthread_attr_destroy(&attr);
}

void join_threads(pthread_t *pthreads)
{
int rc = 0;
for(int i=0; i < CPUTHRDS; i++)
    {
        void *status;
        rc = pthread_join(pthreads[i], &status);
        if (rc) {
            printf("ERROR; return code from pthread_join() is %d\n", rc);
            exit(-1);
        }
        printf("#HOST# Thread %d joined\n", i);
    }
    printf("#HOST# All threads joined\n");
}

void *cpu_thread(void *arg)
{
unsigned long thid = pthread_self();
fprintf(stderr, "started %lu\n", thid);
}

出力

#HOST# Starting Task Threads
launchthread 0
launchthread 1
#HOST# CPU-Threads started: 2
started 46969086678784
started 46969084577536
#HOST# Thread 0 joined
#HOST# Thread 1 joined
#HOST# All threads joined
#HOST# Starting Task Threads
launchthread 0
Segmentation fault (core dumped)

既存の変数への依存関係を削除しようとしましたが、2 回目に失敗します。

ご回答ありがとうございます。

4

0 に答える 0