为什么会存在不等于20000

Ubuntu下gcc编译跑,为什么会存在不等于20000?

int n = 0;
void *fun1(void *a)
{
  for (int i = 0; i < 10000; ++i)
  {
    n++;
  }
  return NULL;
}
void *fun2(void *a)
{
  for (int i = 0; i < 10000; ++i)
  {
    n++;
  }
  return NULL;
}
int main()
{
  pthread_t tid1, tid2;
  pthread_create(&tid1, NULL, fun1, NULL);
  pthread_create(&tid2, NULL, fun2, NULL);
  pthread_join(tid1, NULL);
  pthread_join(tid1, NULL);
  printf("%d\n",n);
  return 0;
}

因为你的n是共享变量,n++存在读-修改-写回 三个操作,不是原子化的
如果线程1读,然后增加,此时线程2也在读,还是旧的值,然后线程1、2分别写回,这就会出现少+1的情况

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    问题可能出现的原因: 1. 代码本身逻辑问题 2. 编译器优化问题 3. 机器性能问题 4. 环境变量不正确导致编译或运行错误

    解决方法: 1. 首先要检查代码逻辑是否正确,特别是循环计算等操作是否有错误。 2. 如果是编译器优化问题,可以考虑关闭一些优化选项或者指定特定的优化方式。 3. 如果是机器性能问题,可以考虑添加资源限制或者调整机器配置来优化程序性能。 4. 检查环境变量是否正确设置,特别是相关路径是否正确指定。

    代码示例: 可以通过添加计时器来检测程序执行时间,以此来判断是否存在机器性能问题。同时,可以添加一些调试日志来帮助定位代码逻辑问题。例如:

    #include <stdio.h>
    #include <time.h>
    
    int main() {
        int sum = 0;
        for (int i = 0; i < 10000; i++) {
            sum += i;
        }
        printf("sum: %d\n", sum);
        return 0;
    }
    

    可以添加以下计时器检测程序执行时间:

    #include <stdio.h>
    #include <time.h>
    
    int main() {
        int sum = 0;
        clock_t start = clock();
        for (int i = 0; i < 1000000000; i++) {
            sum += i;
        }
        clock_t end = clock();
        printf("sum: %d\n", sum);
        printf("time used: %f seconds\n", (double)(end - start) / CLOCKS_PER_SEC);
        return 0;
    }
    

    如果存在环境变量问题,可以检查并重新配置相关环境变量。例如,检查是否设置了正确的LD_LIBRARY_PATH:

    echo $LD_LIBRARY_PATH
    

    如果输出为空或路径不正确,可以使用以下命令重新设置:

    export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^