【发布时间】:2019-09-03 19:58:48
【问题描述】:
我已经查看了有关此主题的许多其他问题,并且我觉得我对这个主题有所了解......但是我想讨论这个问题的一个方面。
如此处所述Destroy static mutex and rwlock initializers
(不必在使用 PTHREAD_MUTEX_INITIALIZER 静态初始化的互斥体上调用 pthread_mutex_destroy()。)
但是我想提出一个更基本的问题:
如果 API 提供了用于初始化对象/类型的宏,类似于 PTHREAD_MUTEX_INITIALIZER,那么该宏是否可以扩展为需要调用动态析构函数的任何内容?
澄清我在问什么:
PTHREAD_MUTEX_INITIALIZER 中是否有任何需要动态析构函数进行清理的操作?
是否可以安全地假设,如果一个对象/类型有一个像 PTHREAD_MUTEX_INITIALIZER 这样的静态宏初始化器,那么宏不可能初始化任何需要动态清理的东西,因此pthread_mutex_destroy 不可能成为 PTHREAD_MUTEX_INITIALIZER 的必要条件?
或者是否有可能在将来更改某些可能导致PTHREAD_MUTEX_INITIALIZER 执行某些绝对需要调用pthread_mutex_destroy 函数的操作?
编辑:我唯一能想到的可能是注册一个 gcc __attribute__((constructor)) 或其他东西以便自动调用一些代码,此时它不再是真正的静态初始化,对吧?如果它真的是一个静态初始化,那么 根据定义 意味着它不能做任何动态的事情;所以根据定义静态初始化宏不需要动态清理函数,对吧?
【问题讨论】:
-
它可以在首次使用时动态分配资源。如果失败,它可以退回到轮询。例如
CRITICAL_SECTION可以在需要时动态分配内部事件。理论上,实现可以在销毁函数中释放此类事件。 -
好点我从未考虑过首次使用场景