什么是关键部分?

时间:2011-04-09 19:02:56

标签: c++ critical-section

只是想要清楚一点。 想象一下,我使用了EnterCriticalSection的windows api。我用EnterCriticalSection(&criticalsection);

打电话给所有人

这是多线程的线程函数

void thread (){

//enter critical section  (part 1)
data
//leave critical section
///more data 1
//entercritical section  (part 2)
//more data 2
//leave critical section 

}

一旦线程进入关键(第1部分),其他线程无法进入该部分,无论更多数据1是否实际上有任何共享数据或不正确?同样在此期间,其他线程也不能进入关键部分的第2部分。

3 个答案:

答案 0 :(得分:9)

关键部分是代码块。如果任何线程进入它,则没有其他线程可以进入,直到它空闲。如果1和2是不同的关键部分(即由不同的信号量处理),如果1被占用,则有人可以输入2。

答案 1 :(得分:3)

规则很简单:只有一个线程可以在特定关键部分内执行代码(在同一实例上调用EnterCriticalSectionLeaveCriticalSection之间执行的代码的任何部分)。从操作系统的角度来看,像代码的一部分,功能在这里是无关紧要的。唯一重要的是对上述例程的调用次数。每当某个线程在特定的关键部分对象上调用某个线程EnterCriticalSection的次数超过LeaveCriticalSection时,它就会被称为“在该关键部分内”。

那就是说你可以创建多个关键部分并且它们是独立实施的。所以一个关键部分永远不会影响另一个关键部分。使用对构造函数的单独调用创建不同的关键部分。

答案 2 :(得分:3)

见:

考虑一个变量

int k

使用此语句在k上运行两个线程

k+=100;

现在假设k等于0.第一个线程开始读取k,找到k = 0,然后将k加100.然后第二个线程在第一个线程写入k = 100之前开始读取k。然后第二个线程将假设k = 0并将其加100,最后在两个线程之后加入k = 100而不是200.这就是我们将k+=100设置为关键部分的原因。

相关问题