gpt4 book ai didi

c - semop - 是否可以增加一个信号量(一组两个),而第二个信号量被阻塞

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:38 27 4
gpt4 key购买 nike

我有两个信号量应该自动更改。

  union semun su;
struct sembuf sb[2];
int num = 2;

semid = semget(num, 3, IPC_CREAT | IPC_EXCL | 0600);

su.val = 1;
semctl(semid, 0, SETVAL, su);
su.val = 0;
semctl(semid, 1, SETVAL, su);

sb[0].sem_num = 0;
sb[0].sem_op = 1; // signal
sb[0].sem_flg = 0;

sb[1].sem_num = 1;
sb[1].sem_op = -1; //wait
sb[1].sem_flg = 0;

semop(semid, sb, 2)

如您所见,一个信号量应该是signal(),另一个应该是wait()

我读到这个 ​​question如果同时更改两个信号量,并且如果有一个信号量被阻塞,那么它并没有真正改变另一个 - 并且所有信号量都将进入休眠状态。

在我的实现中,对我来说非常重要的是:

  1. 两个信号量的操作都将自动发生
  2. 如果第二个信号量被阻塞,那么第一个信号量就没有关系了。意味着第一个信号量将 signal() 按预期进行,第二个信号量将 wait()...

我无法从所附问题中理解是否可以这样做,而且我不确定那里是否有答案......

所以我想问一下是否可以

提前致谢

最佳答案

I read in this question that if both of the semaphores are changed at once, and if there is one semaphore that get blocked, then it doesn't really changes the other - and all of the set is going to sleep.

问题涉及的是一组信号量操作是否原子发生。答案正确地阐明了它是原子的。

而不是这样想

"if both of the semaphores are changed at once"

这样看

"if both of the semaphores are changed as one "

我相信,您随后会欣赏原子性的概念。

在上面的代码中很清楚地做到了这一点

semop(semid, sb, 2)

将同时执行信号量 sb[0] 和 ab[1] 的操作作为单个操作,无论您的意图是什么。

关于c - semop - 是否可以增加一个信号量(一组两个),而第二个信号量被阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15167353/

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