关键部分对象如何精确地适用于多个方法
How Critical Section object works exactly for multiple methods
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()
.但是,如果任何线程同时运行这两个方法,则没有问题。例如。 ThreadA
和ThreadB
两者可能无法同时访问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使用该机制(全局解释器锁)。
但是,如果它们是两个独立的对象,则使用单独的关键部分允许并发使用这些对象。这要高效得多。缺点是,如果这两个对象有时一起使用,则应始终以相同的顺序输入它们的关键部分。
根据要求,您的两个假设都是正确的。
基本上关键部分是你只希望单个线程进入的代码。在该线程完成之前,不允许其他线程进入该关键部分。该关键部分也可以包含多个功能。
您在关键部分的开头持有互斥锁,在离开该部分后释放这些部分。
- OpenGL - 在 NDC 中计算位置适用于着色器,但不适用于'regular'程序
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 如何修复我的最大公约数代码?它适用于除零和零以外的所有数字
- 选择排序C++(已修改)并非适用于所有情况
- 无法让"std::enable_if"适用于无作用域枚举
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 确定夏令时是否适用于特定日期
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- QT 样式表主题,适用于使用属性选择器的整个应用程序
- C++带有适用于左值和右值的引用参数的函数
- 代码适用于调试,但不适用于发布
- C++17 和更新的 std::分配器是否适用于动态数量的自定义堆?
- 适用于大型数组的无复制线程安全环形缓冲区
- NRVO 是否也适用于协程?
- 约束包容是否仅适用于概念?
- Scott Meyers关于首选非成员非友元方法的建议是否适用于对象构造?
- 仅适用于某些模板类型的覆盖方法
- 关键部分对象如何精确地适用于多个方法
- 中的方法<cstring>也适用于字符串类吗?
- 在 AIR 本机扩展中包含库会导致错误,"The extension context does not have a method with the name..."适用于所有方法