C中的pthread、指针和更多令人头痛的问题

C中的pthread、指针和更多令人头痛的问题,c,multithreading,pointers,C,Multithreading,Pointers,我试图得到一个循环中的迭代总数,这个循环被分解成线程,用C语言表示。使用一个全局变量(lock/unlock),一个全局变量[NUM_threads],这两种方法都有效(第一种方法要慢得多);但下面的代码不起作用: #include <stdio.h> #include <time.h> #include <pthread.h> #define THREADS 8 void *loop(void *ptr); int main() { clock

我试图得到一个循环中的迭代总数,这个循环被分解成线程,用C语言表示。使用一个全局变量(lock/unlock),一个全局变量[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++;
        }
    }
}
#包括
#包括
#包括
#定义线程8
void*loop(void*ptr);
int main()
{
时钟=时钟();
pthread_t th[线程];
长lsum[线程]={0};
for(int t=0;t

tsum输出为零。这是关于在pthread_create中来回转换传递的指针的事情吗?或者使用这种方法是完全错误的?

因为
++
的运算符优先级高于一元
*
,所以您是在递增计数器,而不是计数器指向的数组元素。如果你换线

*counter++;

(*counter)++;

然后,
tsum
将像您预期的那样成为1000000000

这种语言是这样定义的,因为它更常见于编写

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

您希望增加指针的位置。

线程函数的用途是什么?他们该怎么办?语句
i-(i/(j+1))+j*j会发生什么?还要注意,即使您不使用线程返回的值,函数也会声明为返回某些内容,而您不会这样做。这就导致了。@Someprogrammerdude,我以前也这么认为,但事实证明,只有当返回值被实际使用时,它才是UB,请参见。还是不好的风格。@Someprogrammerdude这个函数没有做任何特殊的事情。只是想做一些冗长的计算,看看多线程是如何影响执行时间的。@user9814319当你做这种测试时,你必须确保“冗长计算”的结果在某种程度上得到了实际使用,否则编译器就不会麻烦为它生成机码。换句话说,这是一个问题。一旦纠正,编译器可以将线程函数优化为
*counter=1000000/THREADS*10000或普通
*计数器=125000000@Someprogrammerdude我认为这只是一个简化示例程序的产物。真正的东西会在这个循环中做一些有意义的事情。是的!这是我知道的时候错过的东西!但只要将其更改为(*counter)++,执行时间就从4秒增加到37秒!!为什么?@user9814319,因为现在您正在每次迭代中执行实际的内存写入操作。在此更改之前,编译器可能已经能够优化掉整个
循环体。
while (*p) *q++ = *p++;