Я пытаюсь получить общее количество итераций в цикле, которое разбито на потоки в C. Используя глобальный var (блокировка / разблокировка), глобальный var [NUM_THREADS], оба работают (первый намного медленнее);но приведенный ниже код не работает:
#include <stdio.h>
#include <time.h>
#include <pthread.h>
#define THREADS 8
void *loop(void *ptr);
int main()
{
clock_t ts = clock();
pthread_t th[THREADS];
long long lsum[THREADS] = {0};
for (int t = 0; t < THREADS; t++)
{
pthread_create(&th[t], NULL, loop, (void *)&lsum[t]);
}
for (int i = 0; i < THREADS; i++)
{
pthread_join(th[i], NULL);
}
long long tsum = 0;
for (int i = 0; i < THREADS; i++)
{
tsum += lsum[i];
}
clock_t te = clock();
printf("%.3f%s\n", (float)(te - ts) / CLOCKS_PER_SEC, " Seconds");
printf("%lld", tsum);
}
void *loop(void *ptr)
{
long long *counter = ptr;
for (int i = 0; i < 1000000 / THREADS; i++)
{
for (int j = 0; j < 10000; j++)
{
i - (i / (j + 1)) + j *j;
*counter++;
}
}
}
Цума выводится на ноль.Это что-то о приведении туда-сюда переданного указателя в pthread_create?или все неправильно использовать этот метод?