问题标签 [critical-section]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - VC++ 2010:奇怪的关键部分错误
我的程序在我可以重现的小场景中随机崩溃,但它发生在 ntdll.dll 的 mlock.c(这是一个 VC++ 运行时文件)中,我看不到堆栈跟踪。不过,我确实知道它发生在我的一个线程函数中。
这是程序崩溃的 mlock.c 代码:
错误是“指定的句柄无效”。如果我查看 locknum,它是一个大于 _locktable 大小的数字,所以这是有道理的。
这似乎与关键部分的使用有关。我确实在我的线程中使用了 CRITICAL_SECTIONS,通过 CCriticalSection 包装类及其关联的 RAII 保护 CGuard。在这里对两者进行定义以避免更加混乱。
这是崩溃的线程函数:
从哪里CCriticalSection
进来?每个CImage
对象都包含一个CCriticalSection
通过CGuard
RAII 锁使用的对象。此外,每个都CImage
包含一个CSharedMemory
实现引用计数的对象。为此,它还包含两个CCriticalSection
,一个用于数据,一个用于引用计数器。这些交互的一个很好的例子可以在析构函数中看到:
有人遇到过这种错误吗?有什么建议吗?
编辑:我看到了一些调用堆栈:调用来自〜CSharedMemory。所以那里一定有一些竞争条件
编辑:更多 CSharedMemory 代码在这里
multithreading - 在 Delphi 中使用关键部分避免缓存一致性问题?
我刚刚阅读了一篇 MSDN 文章“同步和多处理器问题”,该文章解决了多处理器机器上的内存缓存一致性问题。这真的让我大开眼界,因为我没想到他们提供的示例中可能存在竞争条件。本文解释了写入内存的操作实际上可能不会按照我的代码中编写的顺序发生(从另一个 cpu 的角度来看)。这对我来说是一个新概念!
本文提供了2个解决方案:
- 对需要跨多个 cpu 的缓存一致性的变量使用“volatile”关键字。这是一个 C/C++ 关键字,在 Delphi 中对我不可用。
- 使用 InterlockExchange() 和 InterlockCompareExchange()。如果必须,这是我可以在 Delphi 中做的事情。只是看起来有点乱。
文章还提到“以下同步函数使用适当的屏障来确保内存排序: • 进入或离开临界区的函数”。
这是我不明白的部分。这是否意味着任何仅限于使用关键部分的函数的内存写入都不会受到缓存一致性和内存排序问题的影响?我没有反对 Interlock*() 功能,但我的工具带中的另一个工具会很好!
c++ - 嵌套临界区是否有效?
例如,这是否有效?
显然,我永远不会故意这样做,但如果这是由于函数调用导致“第一级”被调用以锁定对象以用于复杂(例如搜索)算法和“第二级”怎么办?在该对象的访问器函数中被调用?
c# - 如何在 C# 中为类创建“假脱机”服务
我正在研究一种 C# 编程,该编程相当适合该语言。我想我对一般的面向对象编程有很好的理解,以及运行多线程意味着什么,在高层次上,但实际实现我是如所说的擦洗。
我要做的是创建一个工具,该工具将使许多线程独立运行并相互交互,每个线程都将服务于自己的任务并可以调用其他线程。
我确保通信的策略(在不同线程同时发生多个更新时不会丢失任何东西)是在每个类上创建一个可以称为外部的类似假脱机的任务,并将任务添加到给定线程,或为这些线程添加假脱机服务。我不确定我是否应该将它放在班级或外部,并让班级本身为新任务调用假脱机并跟踪假脱机。在这里,我特别考虑如何在空线轴获得任务时向班级发出信号(侦听器方法,因此如果任务想要在新东西到达时被唤醒,则可以订阅池),或者“每 X 秒检查一次,如果出来任务和下一个任务未安排”的方法
创建这个的好策略是什么,我应该在实际班级还是外部创建这个?实现中的关键区域是什么,因为“忙等待检查”允许它只在添加新作业和删除实际 spool 上的作业,而信号将需要添加/删除作业,还需要 goto sleep on 信号是关键的,并且突然增加了对如果进入关键区域的假脱机的高要求,因为这可能会导致阻塞,导致其他阻塞,以及可能的不可预见的死锁。
c - 在什么情况下,Windows 关键部分的锁定计数可能为负数?
是否存在 Windows 中 RTL_CRITICAL_SECTION 结构的 LockCount 字段可以合法为负的任何情况?
我们正在跟踪一个非常难以捉摸的崩溃,我们看到的一个症状是具有负 LockCount 的 CS。崩溃时,计数为 -6,但似乎通常为 -1、-2 等。
在假设发生这种情况是一件非常糟糕的事情之前,我只是想验证该假设是否正确。我几乎找不到关于 RTL_CRITICAL_SECTION 内部工作的信息。
synchronization - 关键区域和监视器作为同步机制的重要性
我在许多教科书中读到临界区和监视器是提供同步机制的高级语言机制。
我在任何文本中都找不到关于这些的更简单的解释。我对这些有些怀疑。
编译器如何实际实现这些?
这些东西在 C、Java、Python 中是否可用。. ?
条件构造在监视器和临界区(conditional critical region)中的重要性是什么
c++ - 这段代码是一个有效的关键部分包装类吗
我实际上有2个问题,这是第一个。
使用我在两个不同站点找到的代码,我编写了这两个关键部分包装类。
它会工作吗?
还有第二个问题。在这里浏览时,我注意到作者没有包括
::初始化、删除、输入、离开临界区。这些不是班级正常工作所必需的吗?还是我错过了什么?
c++ - C ++关键部分不起作用
我的临界区代码不起作用!!!Backgrounder.run 能够修改 MESSAGE_QUEUE g_msgQueue 并且 LockSections 析构函数尚未被调用!!!
额外代码:
openmp - OpenMP 中的 atomic 和 critical 有什么区别?
OpenMP 中的 atomic 和 critical 有什么区别?
我可以做这个
但这不一样吗
?
multithreading - Delphi 线程:在其方法中使用 Synchronize 时,CriticalSection 未“发布”
在我的项目中,我有一个可能由线程本身、其他线程或 VCL(主应用程序)修改的线程。因此,我对每次数据访问都使用 TCriticalSection.Acquire / Release。
正常情况下,下面的代码按预期工作:进入Acquire,Synchronizes with DoCallback,然后释放锁。但是,如果任何其他上下文在它已经被锁定的时候获得了锁,那么下面的代码的执行将在 Synchronize 处停止——并且这一次,它不会进入 DoCallback 方法。
我是否应该跳过 Synchronize 方法(即使 Synchronize 的代码调用 VCL)并依赖于 CriticalSection 本身?这种行为的原因是什么?
主线程代码: