C 我无法理解这个由pthreads引起的奇怪的确定性结果

C 我无法理解这个由pthreads引起的奇怪的确定性结果,c,pthreads,C,Pthreads,我在下面写下了这段代码,在你激怒我之前,是的,我知道两个线程不应该以我设置的方式访问同一个全局变量,这只是测试看看它会产生什么样的随机结果。 因此,该程序接受2个参数,并将其上的所有数字相加为一个全局和(如果是负数,则进行减法)。我想我会给它相同的数字,1正1负,看到线程之间的失同步导致的随机结果,但是,如果我给10.000和-10.000,它运行“正确”,并打印出总和为0,但是如果我给100.000和-100.000(或10的任何更大倍数)它只打印如果我给它100.000和0它会打印的结果(你

我在下面写下了这段代码,在你激怒我之前,是的,我知道两个线程不应该以我设置的方式访问同一个全局变量,这只是测试看看它会产生什么样的随机结果。 因此,该程序接受2个参数,并将其上的所有数字相加为一个全局和(如果是负数,则进行减法)。我想我会给它相同的数字,1正1负,看到线程之间的失同步导致的随机结果,但是,如果我给10.000和-10.000,它运行“正确”,并打印出总和为0,但是如果我给100.000和-100.000(或10的任何更大倍数)它只打印如果我给它100.000和0它会打印的结果(你可以用(100.000和-100.000)和(100.000和0)试一下,结果都是5000050000),所以,好像只有一个线程工作过。 有人能帮我弄明白吗?这是什么原因造成的

#包括
#包括
#包括
#定义NUM_线程2
长和=0;
void*sumAll(void*incr){
龙龙我;
long-long arg=环礁((char*)增量);
printf(“arg是%lld\n”,arg);
如果(arg>0){
//printf(“1arg是%d\n”,arg);
对于(i=0;i=arg;i--){
//printf(“总和减至%lld\n”,总和);
总和+=i;
}
}
pthread_exit(NULL);
}
int main(int argc,char const*argv[]
{
pthread_t threads[NUM_threads];
pthread_create(&threads[0],NULL,sumAll,(void*)argv[1]);
pthread_create(&threads[1],NULL,sumAll,(void*)argv[2]);
pthread_join(线程[0],NULL);
pthread_join(线程[1],NULL);
printf(“最终总%lld\n”,总和);
返回0;
}

我实际上在10000上有一个错误。以下是跑步记录:

$ ./a.out 10000 -10000
arg is -10000
arg is 10000
sum final 9996198
是的,我知道两个线程不应该以我设置的方式访问同一个全局变量

这就是你问题的原因。你正在经历比赛条件。要解决此问题,请使用锁

// Declare a global lock
pthread_mutex_t lock;

// Surround the sum assignments with lock and unlock

void* sumAll(void *incr){
    // Like before
        pthread_mutex_lock(&lock);
        sum+=i;
        pthread_mutex_unlock(&lock);

程序“工作”的最可能原因是线程没有同时运行。第一个在第二个开始之前完成。

您使用的是什么操作系统?“是的,我知道两个线程不应该访问同一个全局变量”-这就是reason@user3386109我使用的是linux,pop_os 20.10,ryzen 7 1700 16gb内存(如果有必要的话)@klutt,但这不是一个奇怪的特定结果吗?你的问题的第一句话就是你的答案。您将获得随机结果,因为您的线程之间存在访问全局
sum
的竞争条件。不要试图去理解它,因为一个人做不到。是的,这就是我所期待的!我想要不正确的结果,比如
9996198
!但这不是我得到的结果,我使用100.000和-100.000时的结果与使用100.000和0时的结果完全相同,这告诉我可能有一个线程不工作,或者甚至可能没有启动