结构或链接列表中的互斥变量如何实际生效。它是否锁定了完整的结构?实际上,当它在结构中声明时,它是如何工作的?它正在工作的内部细节是什么?
这是来自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(¤t->lock);
if (current->value == value) {
prev->link = current->link;
pthread_mutex_unlock(¤t->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