7

只是想对此有所了解。想象一下,我使用 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 部分。

4

3 回答 3

10

临界区是一个代码块。如果任何线程进入它,在它空闲之前没有其他线程可以进入。如果 1 和 2 是不同的临界区(即由不同的信号量处理),如果 1 被占用,则有人可以输入 2。

于 2011-04-09T19:06:05.023 回答
3

看到这个:

考虑一个变量

int k

两个线程正在使用此语句对 k 进行操作

k+=100;

现在假设 k 等于 0。第一个线程开始读取 k,找到 k=0,然后将 k 加 100。然后第二个线程开始读取 k,然后第一个线程写回 k=100。然后第二个线程将假设 k=0 并添加 100,最后在两个线程加入后 k=100 不是预期的 200。这就是我们设置k+=100临界区的原因。

于 2011-04-09T19:39:02.397 回答
3

规则很简单:只有一个线程可以执行特定临界区(在同一实例的调用之间EnterCriticalSectionLeaveCriticalSection在同一实例上执行的任何代码部分)内的代码。从操作系统的角度来看,代码部分、函数在这里是无关紧要的。唯一重要的是对上述例程的调用次数。每当发生某些线程调用EnterCriticalSection的次数多于LeaveCriticalSection特定临界区对象的情况时,就被称为“在该临界区内”。

也就是说,您可以创建多个关键部分,并且它们是独立执行的。所以一个临界区永远不会影响另一个临界区。使用对构造函数的单独调用来创建不同的临界区。

于 2011-04-09T19:07:47.273 回答