gpt4 book ai didi

c - getter 方法的互斥量导致死锁

转载 作者:太空宇宙 更新时间:2023-11-04 04:44:00 26 4
gpt4 key购买 nike

嗨,我想问一下以下问题的最佳解决方案是什么。 (下面解释)

我有以下内存库代码(简化):

 // struct is opaque to callee
struct memory {
void *ptr;
size_t size;
pthread_mutex_t mutex;
};

size_t memory_size(memory *self)
{
if (self == NULL) {
return 0;
}

{
size_t size = 0;

if (pthread_mutex_lock(self->mutex) == 0) {
size = self->size;
(void)pthread_mutex_unlock(self->mutex);
}

return size;
}
}

void *memory_beginAccess(memory *self)
{
if (self == NULL) {
return NULL;
}

if (pthread_mutex_lock(self->mutex) == 0) {
return self->ptr;
}

return NULL;
}

void memory_endAccess(memory *self)
{
if (self == NULL) {
return;
}

(void)pthread_mutex_unlock(self->mutex);
}

问题:

 // ....
memory *target = memory_alloc(100);
// ....
{
void *ptr = memory_beginAccess(target);
// ^- implicit lock of internal mutex

operationThatNeedsSize(ptr, memory_size(target));
// ^- implicit lock of internal mutex causes a deadlock (with fastmutexes)

memory_endAccess(target);
// ^- implicit unlock of internal mutex (never reached)
}

于是,我想到了三种可能的解决方案:

1.) 使用递归互斥锁。 (但我听说这是不好的做法,应尽可能避免)。

2.) 使用不同的函数名称或标志参数:memory_sizeLocked()内存大小()

内存大小(真)内存大小(假)

3.) 如果 pthread_mutex_t 返回 EDEADLK 并递增一个死锁计数器(并在解锁时递减)(与递归互斥锁相同?)

那么这个问题还有别的解决办法吗?还是上述三种解决方案中的一种“足够好”?

提前感谢您的帮助

最佳答案

使用同一功能的两个版本,一个锁定,另一个不锁定。这样你将不得不修改最少的代码。这在逻辑上也是正确的,因为您必须知道何时处于代码的关键部分。

关于c - getter 方法的互斥量导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22995890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com