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的情况
问题可能出现的原因: 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