案例一:
场景:我有两种不同的方法,每种方法都共享通用的全局资源。 Method1()
被 ThreadA
访问,Method2()
被许多其他线程访问,但不是 ThreadA。
要求 :我的要求是如果ThreadA
正在访问Method1()
没有其他线程访问Method2()
.
解决方案 :因此使用公共(public)临界区对象将防止全局资源中的任何冲突。 例如。
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)
}
案例二:
场景:我有两种不同的方法,它们不共享任何资源。
要求:我要求的是不同的线程不能同时运行Method1()
。 Method2()
也类似。但是,如果任何线程同时运行这两种方法,则没有问题。例如。 ThreadA
和 ThreadB
都不能同时访问 Method1()
但 ThreadA
应该是可能的运行 Method1()
和 ThreadB
同时运行 Method2()
。
在这种情况下,如果我在两个方法中使用相同的临界区对象,那么假设 ThreadA 运行方法 1,ThreadB 将必须等待 ThreadA 离开临界区才能开始执行方法 2。
Method1()
{
EnterCriticalSection(&cs)
//Do something
LeaveCriticalSection(&cs)
}
Method2()
{
EnterCriticalSection(&cs)
//Do Something
LeaveCriticalSection(&cs)
}
解决方案:那么在这种情况下,我们是否为不同的方法使用不同的临界区对象??我在两种情况下都正确吗?
在处理多个函数时,我不清楚临界区对象的概念。请帮助我理解这个概念。我在网上试了一下,但找不到相关的资料可以消除我的疑虑。
最佳答案
关键部分通过阻止线程运行代码的特定部分来保护资源。
因此,每个资源都有一个关联的临界区,但所有访问同一资源的多段代码也必须使用相同的临界区对象。
单个关键部分保护两个资源在技术上是可以的。如果两个对象总是一起使用,这实际上是有意义的。事实上,你可以只用一个关键部分来运行你的程序。效率不高,但也不是闻所未闻。例如,Python 使用该机制(全局解释器锁)
但是如果它们是两个独立的对象,使用单独的关键部分允许同时使用这些对象。这要有效得多。缺点是如果这两个对象有时一起使用,您应该总是以相同的顺序进入它们的临界区。
关于c++ - Critical Section 对象如何适用于多种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26995439/