Вызов функции void* из main в C
В настоящее время я работаю над программой, которая использует потоки для вычисления суммы квадратных корней. Моя программа работает, однако одним из требований является использование основного потока для поиска начального значения, и как только я вызываю функцию Void *calc из main, программа прерывается. Существует ли определенный способ сделать такой вызов функции? Это потому, что функция является указателем? Любая помощь ценится.
#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 %lfn", 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: %lfn", total);
}
Программа прерывается, так как функция, по-видимому, вызывается только один раз, а не каждый поток использует функцию. Единственное напечатанное значение - это какое-то неопределенное неправильное число.
1 ответ:
Ваша
calcфункция делаетpthread_exit. Теперьpthread_exitможно и нужно вызывать из основного потока, так что это нормальноЧтобы позволить другим потокам продолжить выполнение, основной поток должен завершиться вызовом pthread_exit (), а не exit(3).
Но поскольку это происходит до того, как был создан какой-либо другой поток, программа просто завершает работу сразу же, даже не запуская другие потоки.
Comments