gpt4 book ai didi

c - 信号量中的 P(&sem) 和 V(&sem) 对代码有何影响?

转载 作者:行者123 更新时间:2023-11-30 19:26:53 26 4
gpt4 key购买 nike

我有这个主代码,它使用函数“doit”作为其参数之一来执行 pthread_create 。我有三个 doit 函数,其中每个函数的 P 和 V 放置方式不同,或者根本没有 P 和 V。我的问题是,每个输出有何不同?更具体地说,每个 doit 函数可能的输出是什么?

到目前为止我所知道的是 P(&sem) 会将 sem 值转换为 0,V 会将值转换为 1。但是,我很难解释它将如何影响代码。

到目前为止我认为 doit 函数 #1 会导致123因为 printf 和 i=i+1 由 P(&sem) 和 V(&sem) 很好地保证了。

此外,我认为 doit 函数 #2 的所有可能输出都是1, 2, 3///1, 3, 3///2, 2, 3///2, 3, 3///3, 3, 3.如果我错了,请纠正我。

但是,就可能的输出而言,我真的不确定当涉及 doit 函数 #3 时多线程会发生什么。我将不胜感激任何形式的帮助,谢谢。

  sem_t sem;
/* semaphore */


int main(){
int j;
pthread_t tids[3];
sem_init(&sem, 0,1);
for (j=0; j<3; j++) {
pthread_create(&tids[j], NULL, doit, NULL);
}
for (j=0; j<3; j++) {
pthread_join(&tids[j], NULL);
}
return 0;
}


doit# 1.
int i = 0;
void *doit(void *arg){
P(&sem);
i = i + 1;
printf("%d\n", i);
V(&sem);
}


doit #2.
int i = 0;
void *doit(void *arg){
P(&sem);
i = i + 1;
V(&sem);
printf("%d\n", i);
}


doit #3.
int i = 0;
void *doit(void *arg){
i = i + 1;
printf("%d\n", i);
}

最佳答案

将打印第一个程序

1
2
3

它是唯一一个对 i 的所有访问都受到 P/V 正确保护的程序。

另外 2 个程序的行为未定义,因为一个线程中的写入可能与其他线程中的读取同时发生,并且根据 C11 5.1.2.4p25 :

  1. The execution of a program contains a data race if it contains two conflicting actions in different threads, at least one of which is not atomic, and neither happens before the other. Any such data race results in undefined behavior.

C11 5.1.2.4p4

  1. Two expression evaluations conflict if one of them modifies a memory location and the other one reads or modifies the same memory location.

这类作业通常要求找出 2 和 3 之间的差异。他们是错误的。从 C 的角度来看,你已经打开了潘多拉魔盒,一切皆有可能。

关于c - 信号量中的 P(&sem) 和 V(&sem) 对代码有何影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56507163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com