我试图在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
}
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,首先你要failure在第一次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"
);
Run Code Online (Sandbox Code Playgroud)
请注意,asm volatile此处也很重要,以确保它不会从while循环中提升.