У меня есть этот основной код, который выполняет pthread_create с функцией "doit" в качестве одного из ее параметров. У меня есть три функции 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.
пожалуйста, поправьте меня, если я ошибаюсь.
Однако я действительно не уверен, что произойдет с несколькими потоками, когда дело доходит до функции # 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);
}