繁体   English   中英

并发访问和无堆对象

[英]concurrent access and free of heap object

此问题是此并发访问的可能子问题, 并且没有数据结构

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

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

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

限制条件:

  1. 您可以使互斥锁成为指针,但不能将其带出对象。

真正的问题:

无法免费持有该锁,因为那样一来,锁所占用的内存也会丢失。

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

由于您说“互斥体可以是一个指针”,因此您可以执行以下操作:

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对象的集合 ,并且对该集合的插入/擦除访问应具有其自己的单独的,集合范围的互斥量。 每当线程想要获取对集合中某个对象的引用时,它都应在互斥锁的保护下这样做,并且该集合应知道谁当前持有引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM