【问题标题】:Destroy static mutex and rwlock initializers销毁静态互斥锁和 rwlock 初始化器
【发布时间】:2015-05-31 10:43:35
【问题描述】:

假设我们有一个使用静态初始化器初始化的全局互斥锁或 rwlock:

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER;

文档说它相当于 pthread_*_init 带有默认参数。

我们是否必须销毁以这种方式初始化的互斥锁或 rwlock?

【问题讨论】:

    标签: c pthreads posix


    【解决方案1】:

    没有。静态分配和动态分配的互斥锁之间的区别基本上可以与位于堆栈或堆中的变量相提并论。您不必返回未动态分配的互斥锁。 引用 Michael Kerrisk 的“Linux 编程接口”:

    当不再需要自动或动态分配的互斥锁时,应使用 pthread_mutex_destroy() 将其销毁。 (不必在使用静态初始化的互斥锁上调用 pthread_mutex_destroy() PTHREAD_MUTEX_INITIALIZER。)

    【讨论】:

      【解决方案2】:

      是的。这些是初始化互斥锁的替代方法,但您只有一种方法来完成它:pthread_*_destroy()

      source:

      在 Pthreads-w32 实现中,应用程序仍应在某些时候调用 pthread_mutex_destroy 以确保释放互斥锁消耗的任何资源。

      (这也是一个 w32 实现,我相信 POSIX 行为是相同的)

      source:

      在默认互斥体属性合适的情况下,宏 PTHREAD_MUTEX_INITIALIZER 可用于初始化互斥体。效果应等同于通过调用 pthread_mutex_init() 进行动态初始化,参数 attr 指定为 NULL,但不执行错误检查。

      如果效果相当,应该使用“镜像”功能pthread_mutex_destroy

      另见此相关SO Post

      【讨论】:

      • 原来@lulijeta 有正确的答案,我被偏执狂habits 愚弄了
      猜你喜欢
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 2017-06-19
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多