【发布时间】:2019-09-29 19:57:36
【问题描述】:
我尝试在 C 语言和 Manjaro OS 上测试多线程。 我写了一个小代码,但我遇到了一个奇怪的问题
我执行了下面的简单代码,但没有得到预期的结果:
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#define THREADS 4
void *routine1(void * x)
{
int result =2;
pthread_exit((void *)result);
}
int main ()
{
int sum=0;
int retval=0;
pthread_t threads[THREADS];
for ( int i=0;i<THREADS;i++)
pthread_create(&threads[i], NULL, routine1, (void *)i );
for (int i=0; i<THREADS; i++)
{
pthread_join(threads[i],&retval);
sum+=retval;
}
printf("%d\n",sum);
return 0;
}
上面代码的结果是:
2
但我希望在输出中看到 8 个值。经过几个小时的调试,我发现如果我在 pthread_create() 函数之后声明 sum 变量,代码将正常运行:
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#define THREADS 4
void *routine1(void * x)
{
int result =2;
pthread_exit((void *)result);
}
int main ()
{
int retval=0;
pthread_t threads[THREADS];
for ( int i=0;i<THREADS;i++)
pthread_create(&threads[i], NULL, routine1, (void *)i );
int sum=0;
for (int i=0; i<THREADS; i++)
{
pthread_join(threads[i],&retval);
sum+=retval;
}
printf("%d\n",sum);
return 0;
}
代码的输出是:
8
这是正确的答案。
我想知道为什么第一个代码是错误的?是因为 pthread_create() 函数吗?
注意:如果你运行这段代码,不要关心警告,它们都是关于强制转换的
【问题讨论】:
-
忽略警告后果自负。
标签: c linux multithreading pthread-join