pthread, указатели и больше головной боли в C - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь получить общее количество итераций в цикле, которое разбито на потоки в 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?или все неправильно использовать этот метод?

1 Ответ

0 голосов
/ 03 июня 2018

Поскольку ++ имеет более высокий приоритет оператора, чем унарный *, вы увеличиваете counter , а не элемент массива, на который указывает счетчик.Если вы измените строку

*counter++;

на значение

(*counter)++;

или

*counter += 1;

, тогда значение tsum составит 10000000000, как вы и ожидали.

Язык определяется таким образом, потому что гораздо чаще пишут такие вещи, как

while (*p) *q++ = *p++;

, где вы хотите указатели для увеличения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...