有人可以解释这两个问题的解决方案(c program,mutex,threads)?

时间:2016-10-25 07:09:07

标签: c pthreads mutex

我有一个问题及其旧考试的答案,但我不明白解决方案。有人可以向我解释一下吗?

鉴于此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;
}
  1. 程序可以发出多少种不同的打印输出? (答案是3)
  2. 您可以在空行添加哪些代码以将各种打印选项减少为1? (答案是int a=0;
  3. 我应该如何得出这些答案?

1 个答案:

答案 0 :(得分:0)

我只是假设您的意思是ab的不同值组合,这些组合是通过“打印选项”打印的。

所以一开始你有ab = 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)但在第一个线程执行打印之前会发生这种情况。