使用不支持多线程的语言锁定代码部分

时间:2012-07-28 16:19:09

标签: multithreading locking

在某些情况下,我们需要确保一个线程不会使用某些代码段,而另一个线程在本节中。使用支持多线程的语言,通过“锁定”这些部分很容易实现。但是当我们必须“模拟”线程时,C#中的lock关键字或Java中的Lock接口都没有内置的东西。我发现在这些情况下锁定部分的最佳方式看起来像这样:

if (!locked){
    locked = true;

    do some stuff

    locked = false;
} else {
    add to queue
}

目前的解决方案有哪些缺点?是否值得积极使用?

2 个答案:

答案 0 :(得分:2)

也许两个线程可以在if语句中输入。

<强>解释

如果在T1语句中输入if并且未更改locked值。突然,如果CPU更改T1 T2locked值将继续false。然后T2也会进入if声明。

T1 -> !locked   -> Stopped -> Waiting -> ... //locked value still false and T2
T2 ->  Waiting  ->  Waked  -> !locked -> ... //will be able to enter into if

您应该查看SemaphoresMutexes,如果您只使用两个流程,则可以使用Peterson's Algorithm,但仍有忙等待处理!

答案 1 :(得分:1)

看看底层系统或操作系统提供的double-checked locking和同步化原语:互斥体,信号量,motinore等。即使C ++没有Lock关键字,你也会感到惊讶,但是一切很好。 C#lock是使用monitor实施的,您可以找到更多详细信息here