什么是线程的关键部分?

时间:2010-03-20 12:18:41

标签: multithreading terminology

请有人可以简单地告诉我一个例子关键部分的含义是什么?用简单的语言

4 个答案:

答案 0 :(得分:4)

critical section是需要在没有外部干扰的情况下执行的代码段 - 即没有其他线程可能影响/受到该段中“中间”状态的影响。

例如,预订系统在保留某些内容时可能会有一个关键部分,因为它需要同时检查项目是否可用,然后将其标记为不再可用,而没有其他尝试保留房间更改在中间的状态。

因此,一段代码的关键部分是一次只允许执行一个执行线程的地方,以防止竞争条件等事情发生。

答案 1 :(得分:1)

关键部分是代码的一部分,如果多个线程同时进行,它们可能会相互干扰,导致错误的结果或其他故障。想象一下处理支票的简单银行例程:

doCheck (writer, recipient, amount) {
    if (amount < 0) return DIAF;
    balance = getBalance( writer );
    if (balance < amount) return NSF;
    setBalance( recipient, getBalance(recipient) + amount );
    setBalance( writer, balance - amount );
}

现在想象我的余额是11,000美元,我写了两张支票:

John, ColumbiaHouse, $0.01
John, MrsJohn, $10,000

现在,我们的银行处理了如此多的支票,以及&#34; ace&#34;程序员DonaldJavaSlump添加了线程,因为性能 - 但他不了解关键部分,所以线程1开始处理第一次检查:

if (amount < 0) return DIAF;             // (0.01 < 0)?  OK
balance = getBalance(John)               // $11,000
if (balance < amount) return NSF;        // (11,000 < 0.01?)  OK
setBalance( ColumbiaHouse, ...           // KaChing! ColumbiaHouse gets paid

现在线程2开始通过处理第二次检查的相同代码部分:

if (amount < 0) return DIAF;             // (10,000 < 0)?  OK
balance = getBalance( John );            // $11,000 (still!)
if (balance < amount) return NSF;        // (11,000 < 10,000?)  OK
setBalance( MrsJohn, ...                 // KaChing! MrsJohn gets paid
setBalance( John, balance - amount );    // my balance is now $1,000 :(

然后线程1开始完成它的工作:

setBalance( John, balance - amount );    // now balance is $10,999.99!!! :)

现在,John和MrsJohn非常高兴,可以免费乘船游览!!

答案 2 :(得分:0)

关键部分包含代码中正在修改共享数据的部分。监视器确保一次只有一个线程进入。

答案 3 :(得分:0)

关键部分例程是解决两个或多个程序同时竞争同一资源的问题的方法。想象一下,两个程序想要增加一个计数器。如果两者同时执行:获取操作数,递增操作数并存储增加的值,则其中一个增量将丢失。在今天的处理器上,程序可以使用原子读 - 修改 - 写指令,例如fetch-and-op,compare-and-swap或exchange。在早期的处理器上,这些指令不存在;问题是只使用普通的汇编程序指令以原子方式完成递增。问题是由Edsgar Dijkstra定义并首先解决的。 &#34;关键部分例程&#34;是他解决问题的代码的名称。