gpt4 book ai didi

c - pthread、指针和更多 C 语言中令人头疼的问题

转载 作者:太空狗 更新时间:2023-10-29 16:10:13 25 4
gpt4 key购买 nike

我正在尝试获取循环中的迭代总数,该循环被分解为线程,在 C 中。使用全局变量(锁定/解锁),全局变量 [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++;
}
}
}

tsum 输出为零。这是关于在 pthread_create 中来回转换传递的指针吗?还是用这个方法都错了?

最佳答案

因为 ++ 比一元 * 有更高的运算符优先级,所以你递增 counter,而不是 counter 指向的数组元素。如果你换行

*counter++;

要么阅读

(*counter)++;

*counter += 1;

然后 tsum 将如您所料最终为 10000000000。

语言是这样定义的,因为这样写更常见

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

希望指针递增的位置。

关于c - pthread、指针和更多 C 语言中令人头疼的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50661293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com