只是想要清楚一点。
想象一下,我使用了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部分。
答案 0 :(得分:9)
关键部分是代码块。如果任何线程进入它,则没有其他线程可以进入,直到它空闲。如果1和2是不同的关键部分(即由不同的信号量处理),如果1被占用,则有人可以输入2。
答案 1 :(得分:3)
规则很简单:只有一个线程可以在特定关键部分内执行代码(在同一实例上调用EnterCriticalSection
和LeaveCriticalSection
之间执行的代码的任何部分)。从操作系统的角度来看,像代码的一部分,功能在这里是无关紧要的。唯一重要的是对上述例程的调用次数。每当某个线程在特定的关键部分对象上调用某个线程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
设置为关键部分的原因。