2

現在、スレッドを使用して平方根の合計を計算するプログラムに取り組んでいます。私のプログラムは動作しますが、必要条件の 1 つはメイン スレッドを使用して初期値を見つけることであり、main から関数 Void *calc を呼び出すとすぐに、プログラムが中断します。そのような関数呼び出しを行う特定の方法はありますか? これは関数がポインタだからですか?どんな助けでも大歓迎です。

#include <pthread.h>
#include <stdio.h>
#include <math.h>
#include <unistd.h>
#define NUM_THREADS 3
int ARGV;
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
double total = 0;


void *calc(void* t){
    int ph = (int)t + 1;
    int start, stop, interval_size;
    interval_size = ARGV/(NUM_THREADS + 1);
    start = ((ph) * interval_size) + 1;
    stop = (ph * interval_size) + 1;
    double ttl;
    int i;

    for (i = start; i <= stop; i++){
            ttl = ttl + sqrt(i);
            printf("Total Thread %i %lf\n", ph, ttl);
        }


    pthread_mutex_lock(&m);
    total = total + ttl;
    pthread_mutex_unlock(&m);

    pthread_exit(NULL);
}

int main(int argc, char* argv[]) {

    int i;
    double ttl;
    ARGV =  atoi(argv[1]);

    pthread_t ti[NUM_THREADS];

    calc(0);
    for (i = 0; i < NUM_THREADS; i++) {
        pthread_create(&ti[i], NULL, calc,(void *)i);
    }
    /*for (i = 1; i <= (ARGV / 4) ; i++){
            ttl = ttl + sqrt(i);    
    }*/
    for (i = 0; i < NUM_THREADS; i++)   {
        pthread_join(ti[i], NULL);
    }

    total = total + ttl;

    printf("Result: %lf\n", total);
}

関数を使用する各スレッドではなく、関数が1回だけ呼び出されるように見えるため、プログラムは中断します。出力される唯一の値は、漠然とした間違った数値です。

4

1 に答える 1

8

あなたのcalc機能はpthread_exit. pthread_exitメインスレッドから呼び出すことができるようになりました。

他のスレッドが実行を継続できるようにするには、メインスレッドは exit(3) ではなく pthread_exit() を呼び出して終了する必要があります。

しかし、これは他のスレッドが作成される前に発生するため、プログラムは他のスレッドを開始することなく、ただちに終了します。

于 2013-10-02T20:03:33.680 に答える