关键部分对象如何精确地适用于多个方法

How Critical Section object works exactly for multiple methods

本文关键字:适用于 方法 何精确 键部 对象      更新时间:2023-10-16

CASE I:

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

要求:我需要的是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)
}

案例二:

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

要求:我要求的是不同的线程不能同时运行Method1()。同样适用于Method2().但是,如果任何线程同时运行这两个方法,则没有问题。例如。 ThreadAThreadB两者可能无法同时访问Method1(),但应该有可能ThreadA正在运行Method1()ThreadB同时运行Method2()。在这种情况下,如果我在两个方法中使用相同的关键部分对象,那么假设线程 A 运行方法 1,线程 B 将不得不等待线程 A 离开关键部分,然后才能开始执行方法2。

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

解决方案:那么在这种情况下,我们是否为不同的方法使用不同的关键部分对象?我的情况正确吗?

在处理多个功能时,我不清楚关键部分对象的概念。请帮助我理解这个概念。我在网上尝试过,但找不到可以消除我疑虑的相关来源。

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

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

从技术上讲,单个关键部分可以保护两个资源。如果两个对象始终一起使用,这实际上是有意义的。事实上,你可以用一个关键部分来运行你的程序。效率不高,但也不是闻所未闻。例如,Python使用该机制(全局解释器锁)。

但是,如果它们是两个独立的对象,则使用单独的关键部分允许并发使用这些对象。这要高效得多。缺点是,如果这两个对象有时一起使用,则应始终以相同的顺序输入它们的关键部分。

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

基本上关键部分是你只希望单个线程进入的代码。在该线程完成之前,不允许其他线程进入该关键部分。该关键部分也可以包含多个功能。

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