gpt4 book ai didi

c++ - Vxworks5.5 semTake 失败可以调用semGive吗

转载 作者:行者123 更新时间:2023-11-28 06:58:00 26 4
gpt4 key购买 nike

我在使用 Vxworks5.5 的项目中有以下代码

m_SemServState = semBCreate(SEM_Q_FIFO, SEM_FULL );

//.... In another function I have following code.

SemStatus = semTake(m_SemServState, 500);
if(OK == SemStatus)
{
// ...
}
else
{
//...
}
semGive(m_SemServState);

我在上面的代码中有以下问题。

  1. 即使 semTake 失败,我们调用 semGive 时上面的代码是否有效?

  2. 当我与作者交谈时,我被告知即使 semTake 失败,我们也可以调用 semGive。会不会有副作用?

  3. 像上面这样的编程是好的做法吗?

感谢您的投入。

最佳答案

首先,由于您正在创建二进制信号量,因此本身没有“计数”。信号量要么是满的,要么是空的,并且没有所有权的概念(就像互斥量一样)。

让我对这个特定代码感到困惑的是,运行这个函数的任务似乎会发出信号。

此处返回两种可能的错误类型:

  • 超时(最有可能)
  • 真正的错误

我希望您检查 errno 以确定您遇到的是这两种情况中的哪一种。如果错误不是超时,那么您可能遇到了严重的问题,几乎可以肯定,信号量的操作完全受到损害,在这种情况下,执行 semGive 也可能会失败。

如果错误是超时(即在 500 个滴答后),那么您的代码应该没问题。

如果只有一个任务在运行这个函数(并且没有其他任务在等待同一个信号量),那么通过这个函数的循环总是会立即成功。事实上,事实上,我看不出这怎么会失败。

所以我必须推断出有多个任务在等待同一个信号量。

如果没有更多细节,很难确定代码是否会按照您的要求执行,但它是合法的。如果不是超时,这实际上取决于“else”分支中发生的情况。

关于c++ - Vxworks5.5 semTake 失败可以调用semGive吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22909272/

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