Critical Section对象如何完全适用于多种方法

时间:2014-11-18 13:24:38

标签: c++ multithreading winapi critical-section

案例I:

场景:我有两种不同的方法,每种方法共享公共全局资源。 Method1()ThreadA由许多其他线程访问Method2(),但不是ThreadA。

要求:我要求的是ThreadA访问Method1()时是否有其他线程访问Method2()

解决方案:因此,使用通用关键部分对象可以防止全局资源中的任何冲突。 例如。

Method1()
{
EnterCriticalSection(&cs)
    //Access common resource (Read/Write) lets say a global queue
LeaveCriticalSection(&cs)
}

Method2()
{
EnterCriticalSection(&cs)
    //Access common resource (Read/Write) lets say a global queue
LeaveCriticalSection(&cs)
}

案例II:

场景:我有两种不同的方法,它们不共享任何资源。

要求:我需要的是不同的线程可能无法同时运行Method1()。同样适用于Method2()。但是,如果任何线程同时运行这两个方法,则没有问题。例如。 ThreadAThreadB两者可能无法同时访问Method1(),但ThreadA正在运行Method1()并且ThreadB正在运行同时Method2()。 在这种情况下,如果我在两个方法中使用相同的临界区对象,那么让我们说ThreadA运行method1,ThreadB必须等待ThreadA在开始执行Method2之前离开临界区。

Method1()
{
EnterCriticalSection(&cs)
    //Do something
LeaveCriticalSection(&cs)
}

Method2()
{
EnterCriticalSection(&cs)
    //Do Something
LeaveCriticalSection(&cs)
}

解决方案:所以在这种情况下,我们是否为不同的方法使用不同的临界区对象?我在案件中是否正确?

在处理多个函数时,我不清楚临界区对象的概念。请帮助我理解这个概念。我在网上试过,但找不到可以解决我怀疑的相关来源。

2 个答案:

答案 0 :(得分:3)

关键部分通过阻止线程运行代码的特定部分来保护资源。

出于这个原因,每个资源都有一个关联的关键部分,但是所有访问同一资源的多段代码也必须使用相同的关键部分对象。

技术上,单个关键部分可以保护两个资源。如果两个对象总是一起使用,这实际上是有意义的。实际上,您可以只使用一个关键部分来运行您的程序。效率不高,但也不是闻所未闻。例如,Python使用该机制(Global Interpreter Lock)

但如果它们是两个独立的对象,则使用单个关键部分允许并发使用对象。这样效率更高。缺点是如果两个对象有时一起使用,你应该总是以相同的顺序输入他们的关键部分。

答案 1 :(得分:0)

根据要求,您的两个假设都是正确的。

基本上关键部分是您只需要输入单个线程的代码。直到该线程完成,不允许其他线程进入该关键部分。该关键部分也可以包含多个函数。

您在离开该部分后释放的关键部分的开头处持有互斥锁。