如果使用同一个锁进入不同的临界区会发生什么
What happens if the same lock is used to enter different critical sections
我的代码中有 2 个关键部分。我可以使用同一个锁进入不同的临界区吗?我不明白这段代码会出什么问题。
void func1(int y, int z)
{
writeLock.lock()
x = y; // critical section 1
writeLock.unlock()
...
while(1)
{
writeLock.lock()
myVar = z; // critical section 2
writeLock.unlock()
if (z == 100)
break;
}
}
我不想在循环内对 x = y
进行赋值,所以我在两个地方使用了相同的锁。这样做可以吗?
如果 x
和 myvar
完全不相交,那么你不应该对这两个关键部分使用相同的互斥锁,而是每个关键部分使用一个互斥锁。
这样做,如果一个线程在x
临界区,那么没有其他线程可以进入同一个临界区,但是另一个线程可以进入myvar
临界区(反之亦然) ).
在您的解决方案中,触摸 x
会阻止任何其他线程同时触摸 myvar
,这似乎不合理。
« 可以吗? » 是的,它本身并没有 错误 ,但它不是最优的,因为它人为地序列化了可以同时执行的代码的不同部分。
我的代码中有 2 个关键部分。我可以使用同一个锁进入不同的临界区吗?我不明白这段代码会出什么问题。
void func1(int y, int z)
{
writeLock.lock()
x = y; // critical section 1
writeLock.unlock()
...
while(1)
{
writeLock.lock()
myVar = z; // critical section 2
writeLock.unlock()
if (z == 100)
break;
}
}
我不想在循环内对 x = y
进行赋值,所以我在两个地方使用了相同的锁。这样做可以吗?
如果 x
和 myvar
完全不相交,那么你不应该对这两个关键部分使用相同的互斥锁,而是每个关键部分使用一个互斥锁。
这样做,如果一个线程在x
临界区,那么没有其他线程可以进入同一个临界区,但是另一个线程可以进入myvar
临界区(反之亦然) ).
在您的解决方案中,触摸 x
会阻止任何其他线程同时触摸 myvar
,这似乎不合理。
« 可以吗? » 是的,它本身并没有 错误 ,但它不是最优的,因为它人为地序列化了可以同时执行的代码的不同部分。