我有一个简单的问题,就是关于多线程程序的。据我所知,多线程程序共享进程的内存空间,包括栈、全局内存区域、文件描述符等。我想知道为什么在第一个示例中存在一致性问题,因为理论上所有线程都共享栈,在第二个示例中会出现竞争问题。
#include <stdio.h>
#include <pthread.h>
void *thr(void *arg)
{
for(int i = 0; i < 50; i++)
printf("Thread = %zu Value= %d\n", pthread_self(), i);
return NULL;
}
int main(void)
{
pthread_t threads[2];
for(int i = 0; i < 2; i++)
pthread_create(&threads[i], NULL, thr, NULL);
for(int i = 0; i < 2; i++)
pthread_join(threads[i], NULL);
return 0;
}
第二个运行问题的程序
#include <stdio.h>
#include <pthread.h>
int i = 0;
void *thr(void *arg)
{
for(; i < 50; i++)
printf("Thread = %zu Value= %d\n", pthread_self(), i);
return NULL;
}
int main(void)
{
pthread_t threads[2];
for(int i = 0; i < 2; i++)
pthread_create(&threads[i], NULL, thr, NULL);
for(int i = 0; i < 2; i++)
pthread_join(threads[i], NULL);
return 0;
}
以下是与竞态问题相关的3个示例,这些变量在主线程中创建,并作为参数传递给函数,也就是说,唯一共享的堆栈来自于主线程?
#include <stdio.h>
#include <pthread.h>
void *thr(void *arg)
{
int *ptr = (int *)arg;
for(; *ptr < 50; (*ptr)++)
printf("Thread = %zu Value= %d\n", pthread_self(), *ptr);
return NULL;
}
int main(void)
{
int i = 0;
pthread_t threads[2];
for(int i = 0; i < 2; i++)
pthread_create(&threads[i], NULL, thr, &i);
for(int i = 0; i < 2; i++)
pthread_join(threads[i], NULL);
return 0;
}