插入到 C 语言结构或链表中的互斥锁如何实际工作.什么是内幕细节?



结构或链接列表中的互斥变量如何实际生效。它是否锁定了完整的结构?实际上,当它在结构中声明时,它是如何工作的?它正在工作的内部细节是什么?

这是来自oracle站点的示例代码:-

typedef struct node1 {
int value;
struct node1 *link;
pthread_mutex_t lock;
} node1_t;
node1_t ListHead;
node1_t *delete(int value)
{
node1_t *prev, *current;
prev = &ListHead;
pthread_mutex_lock(&prev->lock);
while ((current = prev->link) != NULL) {
pthread_mutex_lock(&current->lock);
if (current->value == value) {
prev->link = current->link;
pthread_mutex_unlock(&current->lock);
pthread_mutex_unlock(&prev->lock);
current->link = NULL;
return(current);
}
pthread_mutex_unlock(&prev->lock);
prev = current;
}
pthread_mutex_unlock(&prev->lock);
return(NULL);
}

所以在上面的代码中,第 10 行 - thread_mutex_lock(&prev->lock(; 它如何服务于它的目的。 这是要遵循的标准规则吗?

谢谢

互斥体不会锁定东西。您锁定互斥锁。

当您运行pthread_mutex_lock(&prev->lock);时,它会锁定互斥锁,并且在您解锁之前,没有其他线程可以锁定相同的互斥锁。如果另一个线程尝试这样做,它将等到您解锁它。

互斥锁不知道结构。这取决于您的程序。

我不是100%确定你在问什么。互斥锁可以被锁定,结构体可以包含这样的互斥锁,但我不认为互斥锁真的"锁定"了整个结构。

让我们通过查看以下结构来简化您的问题。

typedef struct node1 {
int value;
struct node1 *next;
pthread_mutex_t lock;
} node1_t;

根据 pthreads 的手册页,调用pthread_mutex_lock(lock)会尝试锁定互斥锁,锁定后其他人无法锁定它,直到它被释放。

换句话说,在你锁定互斥锁之后,其他代码将无法锁定它(在你释放它之前(,这就像"锁定"整个数据结构一样。访问结构的代码的每个部分首先检查互斥锁,因此它就像我们已经锁定了整个结构一样。

有关更多详细信息,我建议您阅读以下手册页: https://man7.org/linux/man-pages//man3/pthread_mutex_lock.3p.html

相关内容

  • 没有找到相关文章

最新更新