在结构中实现信号量,然后使用malloc初始化结构,是否会有futex错误?

问题描述

这是我第一次问堆栈溢出问题,如果我做错了什么,请随时指出。非常感谢!

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

struct myStruct
{
    sem_t sem;
}myStruct;

在结构的初始化代码中,我这样写:

myStruct* init_myStruct()
{
    myStruct* tmp = (myStruct*)malloc(sizeof(myStruct)); 
    sem_init(&tmp->sem,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()返回的指针。