我有一个问题及其旧考试的答案,但我不明白解决方案。有人可以向我解释一下吗?
鉴于此C程序:
int a = 0;
int b = 0;
pthread_mutex_t m;
void * f()
{
_________________ (Empty Line for question number 2)
a = a + 1;
pthread_mutex_lock(&m);
b = b + 1;
printf("a = %d, b = %d\n", a, b);
pthread_mutex_unlock(&m);
return NULL;
}
int main() {
pthread_t t1, t2;
pthread_mutex_init(&m, NULL);
pthread_create(&t1, NULL, &f, NULL);
pthread_create(&t2, NULL, &f, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return 0;
}
int a=0;
)我应该如何得出这些答案?
答案 0 :(得分:0)
我只是假设您的意思是a
和b
的不同值组合,这些组合是通过“打印选项”打印的。
所以一开始你有a
和b
= 0
然后你创建线程,a
上有一个竞赛条件,所以结果不确定。会发生什么:
t1:read a=0 write a=0+1
t1:read b=0 write b=0+1
t1:print `a=1, b=1`
t2:read a=1 write a=1+1
t2:read b=1 write b=1+1
t2:print `a=2, b=2`
可能发生的另一件事:
t1: read a =0
t2: read a =0
t1: write a =0+1
t2: write a =0+1
t1: read b=0 write b=0+1
t1: print `a=1, b=1`
t2: read b=1 write b=1+1
t2: print `a=1, b=2`
这是一种可能性。 a
的读写可以随时发生。但这些是不同产出如何发生的例子。 t1和t2也可以互换。无法保证t1先执行。
第二个答案隐藏了a
本地a
的全局a,其他线程无法覆盖。所以输出总是。
a=1, b=1
a=1, b=2
编辑:忘记第一个问题的第三个打印方案
a=2, b=1
a=2, b=2
如果a
被单独读取和写入(第一次读写t1然后读写t2)但在第一个线程执行打印之前会发生这种情况。