0

在某些情况下,我们需要确保某段代码不会被一个线程使用,而另一个线程在该段中。使用支持多线程的语言很容易通过“锁定”这些部分来实现。但是当我们必须“模拟”线程时,没有内置的东西,比如lockC# 中的关键字或LockJava 中的接口。我发现在这些情况下锁定部分的最佳方法如下所示:

if (!locked){
    locked = true;

    do some stuff

    locked = false;
} else {
    add to queue
}

当前解决方案的缺点是什么?值得积极使用吗?

4

2 回答 2

2

也许两个线程可以进入if语句。

解释

如果T1if语句中输入并且不更改locked值。突然间,如果 CPU 更改T1T2locked值将继续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,但它仍然有一个繁忙的等待处理!

于 2012-07-28T16:25:24.513 回答
1

看看底层系统或操作系统提供的双重检查锁定和同步原语:互斥锁、信号量、motinore 等。您会惊讶于即使 C++ 没有Lock关键字,但一切都很好。C#lock是使用监视器实现的,您可以在此处找到更多详细信息。

于 2012-07-28T16:40:11.350 回答