1

我有三个POSIX?信号量和几个错误条件。信号量是全局可访问的。我如何检查它们是否在发生错误之前被销毁(或者它们是否首先被初始化)。

// Example c program
#include <semaphore.h>

sem_t mySemaphore;

void errorHandling(){
    // if (mySemaphore exists)
    //     sem_destroy(&mySemaphore);
}

int main(){

    // possible errors

    if ((sem_init(&mySemaphore, 0, 1)) < 0)
        errorHandling();

    // more possible errors and multi threading stuff

    sem_destroy(&mySemaphore);

    return (EXIT_SUCCESS);
}
4

2 回答 2

1

您需要一个单独的标志,默认情况下为 false。初始化时设置为真,销毁时返回假。

如果是多线程应用程序,请确保您使用互斥锁保护这些访问。另外,我强烈建议您编写函数来在一个地方处理所有这些。

于 2012-11-24T03:11:08.013 回答
1

参考 OP 的代码,并根据 sem_init() 手册页,在可能已经初始化的信号量上调用该函数会导致未定义的行为。如果您不关心潜在的竞争,您可以尝试调用 sem_getvalue() 并使用其 EINVAL 返回值来测试先前信号量的初始化。

于 2019-07-22T08:28:55.573 回答