并发访问和没有堆对象

时间:2012-02-02 17:31:52

标签: c multithreading concurrency

此问题可能是此concurrent access and free of a data structure

的子问题

另一个问题是设计开放,这个问题更具体。

struct ds
{
   int x,y,z;       
   pthread_mutex_t mutex;
};

我需要一个确定性的解决方案,通过它我可以同时访问1个ds类型的对象并释放它。

约束:

  1. 您可以将互斥锁设为指针,但不能将其从对象中取出。
  2. 真正的问题:

    Free无法持有锁,因为锁占用的内存也会丢失。

    我已经阅读了很多关于引用计数的论文和文章,但是每一篇都在ds之外保持锁定。我想要一个解决方案,我可以在ds内部锁定或引用锁。

1 个答案:

答案 0 :(得分:1)

既然你说“互斥体可以是一个指针”,你可以这样做:

struct ds { pthread_mutex_t * mutex; /* ... */ };

struct ds * create_ds()
{
    struct ds * p = calloc(1, sizeof(struct ds));
    pthread_mutex_t * q = malloc(sizeof(pthread_mutex_t));
    pthread_mutex_init(q, NULL);
    ds->mutex = q;
    return p;
}

void free_ds(struct ds * p)
{
    pthread_mutex_t * q = p->mutex;
    pthread_mutex_lock(q);
    free(p);
    pthread_mutex_unlock(q);
    pthread_mutex_destroy(q);
    free(q);
}

在我看来,破坏一个对象并不是真正符合并发访问/同步习惯的东西。如果你破坏某些东西,它就不再存在了,所以所有的线程都会受到影响。一个线程如何知道给定的ds指针是否仍指向有效的东西?

相反,您应该在某处拥有ds个对象的集合,并且对该集合的插入/擦除访问应具有其自己的,独立的集合范围的互斥锁。每当一个线程想要获取对集合中对象的引用时,它应该在互斥锁的保护下这样做,并且集合应该知道谁当前正在持有引用。