【问题标题】:Can a pthread_mutex_t be moved in memory?可以在内存中移动 pthread_mutex_t 吗?
【发布时间】:2013-01-14 21:21:15
【问题描述】:

我想构建一个动态分配的 pthread_mutex 数组,该数组会随着时间的推移而增长(添加更多互斥体)。我的问题是,如果使用 realloc() 移动数组,它们是否仍然有效。我担心的是 pthread_mutex_init() 可能会以某种方式设置取决于当时互斥体地址的内部信息。

更具体地说,这是一个显示问题的玩具 sn-p:

pthread_mutex_t *my_mutexes = (pthread_mutex_t *) malloc (sizeof(pthread_mutex_t));
pthread_mutex_init (my_mutexes, NULL);
my_mutexes = (pthread_mutex_t *) realloc (my_mutexes, 2*sizeof(pthread_mutex_t));
/* does my_mutexes[0] still work at this point? */

我想在所有这些情况下的答案都是“如果没有明确允许,则假设不是”,但我想在这里获得明智的建议。如果结论不是这样做,那么我想知道一般来说,我如何创建一个不断增长的互斥体列表。

【问题讨论】:

    标签: mutex realloc


    【解决方案1】:

    移动互斥锁是不安全的。例如,Linux 上的一些互斥锁实现使用了futex 系统调用,它专门等待互斥锁的地址。

    如果它需要动态增长,我建议使用pthread_mutex_t 指针的主数组和该主列表的互斥体。当您增加数组时,您将只是移动指针列表而不是互斥锁本身。可以使用普通的malloc 分配互斥锁。

    【讨论】:

    • 好主意,完全避免了这个问题,非常感谢。
    • 只有当您尝试移动当前锁定的pthread_mutex_t 时,futex 的问题才相关?或者即使当时互斥锁已解锁,移动也会破坏某些东西?
    • 这里是我上面问题的更多讨论:twitter.com/m_ou_se/status/1403413967846977538
    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 2011-02-10
    • 2016-04-16
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 2023-04-08
    • 2013-10-18
    相关资源
    最近更新 更多