gpt4 book ai didi

c - 在 C 中实现互斥锁

转载 作者:太空狗 更新时间:2023-10-29 17:09:09 25 4
gpt4 key购买 nike

我试图在 C 中创建一个非常简单的自旋锁互斥锁,但出于某种原因,我遇到了两个线程同时获取锁的情况,这本不应该是可能的。它在多处理器系统上运行,这可能就是出现问题的原因。知道为什么它不起作用吗?

void mutexLock(mutex_t *mutexlock, pid_t owner)
{
int failure = 1;
while(mutexlock->mx_state == 0 || failure || mutexlock->mx_owner != owner)
{
failure = 1;
if (mutexlock->mx_state == 0)
{
asm(
"movl $0x01,%%eax\n\t" // move 1 to eax
"xchg %%eax,%0\n\t" // try to set the lock bit
"mov %%eax,%1\n\t" // export our result to a test var
:"=r"(mutexlock->mx_state),"=r"(failure)
:"r"(mutexlock->mx_state)
:"%eax"
);
}
if (failure == 0)
{
mutexlock->mx_owner = owner; //test to see if we got the lock bit
}
}
}

最佳答案

首先,您将在第一次执行 while() 条件时测试未初始化的变量(失败)。

您的实际问题是您告诉 gcc 为 mx_state 使用寄存器 - 这显然不适用于自旋锁。尝试:

    asm volatile (
"movl $0x01,%%eax\n\t" // move 1 to eax
"xchg %%eax,%0\n\t" // try to set the lock bit
"mov %%eax,%1\n\t" // export our result to a test var
:"=m"(mutexlock->mx_state),"=r"(failure)
:"m"(mutexlock->mx_state)
:"%eax"
);

请注意 asm volatile 在这里也很重要,以确保它不会被提升到 while 循环之外。

关于c - 在 C 中实现互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2679816/

25 4 0