案例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()
。但是,如果任何线程同时运行这两个方法,则没有问题。例如。 ThreadA
和ThreadB
两者可能无法同时访问Method1()
,但ThreadA
正在运行Method1()
并且ThreadB
正在运行同时Method2()
。
在这种情况下,如果我在两个方法中使用相同的临界区对象,那么让我们说ThreadA运行method1,ThreadB必须等待ThreadA在开始执行Method2之前离开临界区。
Method1()
{
EnterCriticalSection(&cs)
//Do something
LeaveCriticalSection(&cs)
}
Method2()
{
EnterCriticalSection(&cs)
//Do Something
LeaveCriticalSection(&cs)
}
解决方案:所以在这种情况下,我们是否为不同的方法使用不同的临界区对象?我在案件中是否正确?
在处理多个函数时,我不清楚临界区对象的概念。请帮助我理解这个概念。我在网上试过,但找不到可以解决我怀疑的相关来源。
答案 0 :(得分:3)
关键部分通过阻止线程运行代码的特定部分来保护资源。
出于这个原因,每个资源都有一个关联的关键部分,但是所有访问同一资源的多段代码也必须使用相同的关键部分对象。
技术上,单个关键部分可以保护两个资源。如果两个对象总是一起使用,这实际上是有意义的。实际上,您可以只使用一个关键部分来运行您的程序。效率不高,但也不是闻所未闻。例如,Python使用该机制(Global Interpreter Lock)
但如果它们是两个独立的对象,则使用单个关键部分允许并发使用对象。这样效率更高。缺点是如果两个对象有时一起使用,你应该总是以相同的顺序输入他们的关键部分。
答案 1 :(得分:0)
根据要求,您的两个假设都是正确的。
基本上关键部分是您只需要输入单个线程的代码。直到该线程完成,不允许其他线程进入该关键部分。该关键部分也可以包含多个函数。
您在离开该部分后释放的关键部分的开头处持有互斥锁。