在struct中实现一个semaphore,然后用malloc()初始化一个struct,会不会出现futex错误?

Implementing a semaphore in a struct, then use malloc() to initialize a struct, will there be futex errors?

第一次问关于stack overflow的问题,有什么不对的地方欢迎指出。非常感谢!

在一个结构中,有一个 sem 类型的变量 sem_t。

struct myStruct
{
    sem_t sem;
}myStruct;

在struct的初始化代码中,我是这样写的:

myStruct* init_myStruct()
{
    myStruct* tmp = (myStruct*)malloc(sizeof(myStruct)); 
    sem_init(&tmp->sem, 0, 1);
    return tmp;
}

我的问题是:

  1. init_myStruct() 是否正确执行?这会导致 futex 错误吗?是否需要将信号量 sem 声明为静态变量?
  2. 第二个问题来自here。假设我们在 main 中调用 init_myStruct(),那么我们需要在释放结构之前释放信号量 sem。假设指向 myStruct 的指针在 main 中分配给 s,那么简单地执行 free(&s->sem) 然后我们可以 free(s) 是否正确?提前致谢。
  1. 信号量可以在内存中的任何地方。它在使用 malloc() 分配的内存中没有问题,只要您在释放内存之前销毁信号量,如其他问题的答案中所述。

  2. 您只能释放从 malloc() 返回的相同指针。由于您分配了整个结构,因此您也需要释放它。所以 main() 应该做 free(s)。你不能做 free(&s->sem) 因为 &s->sem 不是 malloc().

    返回的指针