c++ - Critical Section 对象如何适用于多种方法

标签 c++ multithreading winapi critical-section

案例一:

场景:我有两种不同的方法,每种方法都共享通用的全局资源。 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() 也类似。但是,如果任何线程同时运行这两种方法,则没有问题。例如。 ThreadAThreadB 都不能同时访问 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/

相关文章:

ruby - 如何阻止主线程退出?

c++ - 动态使用 GetDriveType

c - 如何等待30小时?

c++ - 未调用复制构造函数!

c++ - 简单 C++ 代码上的运行时错误信号 11

c++ - 将值存储在指针 var 中

c++ - 转换构造函数

c++ - 如何改变被其他线程占用的对象共享指针指向?

multithreading - 如何正确使用线程专有数据

c++ - Visual C++ 2010 控制台应用程序 dwFontSize 值?