【发布时间】:2019-10-23 17:15:39
【问题描述】:
我有这个以函数“doit”作为参数之一执行 pthread_create 的主代码。我有三个 doit 函数,其中每个函数的 P 和 V 放置不同,或者根本没有 P 和 V。我的问题是,每个输出有何不同?更具体地说,每个 doit 函数可能的输出是什么?
到目前为止,我所知道的是 P(&sem) 会将 sem 值变为 0,而 V 会将值变为 1。但是,我很难解释它将如何影响代码。
到目前为止,我认为 doit 函数 #1 将导致 1 2 3 因为 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);
}
【问题讨论】:
-
C 没有指定将在 2 或 3 中打印什么,由于数据竞争,一切皆有可能。但是,在 3 中存在写入竞赛,这可能意味着在实践中可能会发生比 2 更特殊的结果。
-
因此我们可以肯定地说的唯一功能是第一个。
标签: c linux multithreading pthreads semaphore