在某些情况下,我们需要确保一个线程不会使用某些代码段,而另一个线程在本节中。使用支持多线程的语言,通过“锁定”这些部分很容易实现。但是当我们必须“模拟”线程时,C#中的lock
关键字或Java中的Lock
接口都没有内置的东西。我发现在这些情况下锁定部分的最佳方式看起来像这样:
if (!locked){
locked = true;
do some stuff
locked = false;
} else {
add to queue
}
目前的解决方案有哪些缺点?是否值得积极使用?
答案 0 :(得分:2)
也许两个线程可以在if
语句中输入。
<强>解释强>
如果在T1
语句中输入if
并且未更改locked
值。突然,如果CPU更改T1
T2
,locked
值将继续false
。然后T2
也会进入if
声明。
T1 -> !locked -> Stopped -> Waiting -> ... //locked value still false and T2
T2 -> Waiting -> Waked -> !locked -> ... //will be able to enter into if
您应该查看Semaphores和Mutexes,如果您只使用两个流程,则可以使用Peterson's Algorithm,但仍有忙等待处理!
答案 1 :(得分:1)
看看底层系统或操作系统提供的double-checked locking和同步化原语:互斥体,信号量,motinore等。即使C ++没有Lock
关键字,你也会感到惊讶,但是一切很好。 C#lock
是使用monitor实施的,您可以找到更多详细信息here。