假设我有一个sruct:
typedef struct peer_info {
int ip;
int port;
int offset;
pthread_mutex_t mutex;
} peer_info;
然后我使用该结构并释放如下结构:
peer_info* p_info = (peer_info*)malloc(sizeof(peer_info));
pthread_mutex_init(&p_info->mutex, NULL);
/* do some work on the p_info */
// need I call the pthread_mutex_destory(&p_info->mutex); ?
free(p_info);
我检查了glibc ntpl souce代码,似乎我不需要显式调用pthread_mutex_destory()
,因为pthread_mutex_t
上没有分配memroy,这是一个联合类型。
是。如果您已经用pthread_mutex_init()
初始化了互斥体,那么在释放内存之前,应该用pthread_mutex_destroy()
销毁它。
POSIX标准考虑了互斥体完全驻留在pthread_mutex_t
类型中的实现,以及该类型仅包括对某些外部分配的互斥体对象的引用的实现。pthread_mutex_init()
由于各种资源耗尽的原因而被允许失败,这一事实加强了这一点。
在适当的情况下调用pthread_mutex_destroy()
可以确保代码可移植到后一种实现。
我在Richard的APUE书中找到了答案。
互斥变量由pthread_mutex_t数据类型表示。在我们之前可以使用互斥变量,我们必须首先通过将其设置为常量来初始化它PTHREAD_MUTEX_INITIALIZER(仅用于静态分配的互斥(或调用pthread_mutex_init。如果我们动态地分配互斥(通过调用malloc例如(,那么我们需要在释放内存之前调用pthread_mutex_destroy。