gpt4 book ai didi

c - 在 C 中使用信号量实现虚拟程序

转载 作者:行者123 更新时间:2023-11-30 15:02:00 24 4
gpt4 key购买 nike

我正在用 C 语言练习信号量。我编写了一个愚蠢的程序,试图复制类笔记中的示例。当编译以下代码(gcc -o ex3 ex3.c -lpthread)并执行它(./ex3)时,没有任何反应。

#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

sem_t S1;
sem_t S2;
sem_t S3;

int main(){

int fa=4;
int fb=2;
int sum=0;

sem_init(&S1, 0, 1);
sem_init(&S2, 0, 0);
sem_init(&S3, 0, 0);

/* Proceso A*/
while (fa<4)
{
sem_wait(&S1);
sum = sum + 2;
sem_post(&S2);
fa++;
}

/* Proceso B*/
while (fb<2)
{
sem_wait(&S2);
sem_wait(&S2);
sum = sum + 3;
sem_post(&S3);
fb++;
}

/* Proceso C*/
while (1)
{ /* Imprimir */
sem_wait(&S3);
printf("%d,", sum);
sem_post(&S1);
sem_post(&S1);
if (fa>4 && fb>2)
exit(0);
}

return 0;
}

我的想法是向进程 A 和 B 添加等待和信号,以便更好地理解这些信号量的作用。但在此之前,我需要查看结果:D

如有任何帮助,我们将不胜感激。

最佳答案

My idea is to play adding waits and signals to Process A and B in order to understand a bit better what these semaphores do. But before, I need to see the result :D

您的小程序中只有一个进程,因此很难理解执行此练习的信号量。

确实,由于错误表达式,它总是跳过第一个和第二个 while 循环,然后卡在

sem_wait(&S3);

因为它被初始化为0并且永远不会改变。所以此时它将永远等待。

我建议初始化

int fa=0;
int fb=0;

这样它将执行前两个循环内的操作。另外,为了能够退出最终的 while(1) 循环,我们需要在每次检查 while 表达式而不是循环末尾的 fa++/fb++ 后递增 fa 和 fb。所以最终的程序将如下所示:

#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

sem_t S1;
sem_t S2;
sem_t S3;

int main() {

int fa = 0;
int fb = 0;
int sum = 0;

sem_init(&S1, 0, 4);
sem_init(&S2, 0, 0);
sem_init(&S3, 0, 0);

/* Proceso A*/
while (fa++ < 4) {
sem_wait(&S1);
sum = sum + 2;
sem_post(&S2);
}

/* Proceso B*/
while (fb++ < 2) {
sem_wait(&S2);
sem_wait(&S2);
sum = sum + 3;
sem_post(&S3);
}

/* Proceso C*/
while (1) { /* Imprimir */
sem_wait(&S3);
printf("%d\n", sum);
sem_post(&S1);
sem_post(&S1);
if (fa > 4 && fb > 2)
break;
}

return 0;
}

此外,我将 exit(0) 调用更改为break,并将\n 添加到 printf 而不是逗号,因为它在第一次迭代后退出。

这将打印出 14,然后退出。希望这对结果有所帮助。但为了更好地理解信号量,我建议从类似 https://www.cs.mtu.edu/~shene/NSF-3/e-Book/SEMA/basics.html 开始

关于c - 在 C 中使用信号量实现虚拟程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41202398/

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