并发访问和释放堆对象

标签 c multithreading concurrency

这个问题可能是这个 concurrent access and free of a data structure 的子问题

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

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

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

约束:

  1. 您可以将 mutex 设为指针,但不能将其从对象中取出。

真正的问题:

持有锁不能释放,因为锁占用的内存也丢失了。

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

最佳答案

既然你说“mutex can be a pointer”,你可以这样做:

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

关于并发访问和释放堆对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9117007/

相关文章:

c# - 如何正确避免C#中的线程创建开销/重用线程

Python 二进制信号量 VS 锁

c# - WCF 调用一个函数而不等待它完成它的工作?

C 编程错误,打印链表,在运行时执行代码崩溃

c - 我的 C split() 中的 SIGSEGV

改变 const 指针的值

c++ - 游戏逻辑的异步屏幕更新,C++

python - PyGTK 阻塞非 GUI 线程

java - 同步无限循环服务的初始化部分

c - 如何识别用户空间和内核空间之间的特定套接字?