问题标签 [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.
multithreading - SetEvent 是原子的吗?
有 2 个或更多线程在不受关键部分保护的同一事件处理程序上调用 Win32 API 的 SetEvent 是否安全?
multithreading - 如何在 Delphi 中实现线程安全的列表包装器?
我有一个列表包装器,它维护两个 Tstringlists 和一个 TClassList
我需要这是线程安全的,例如:
- 不允许并发写入(应进入某种等待状态)
- 不允许边读边写(反之亦然)(应进入某种等待状态)
- 允许并发读取
关于如何做到这一点的任何想法?我的直觉告诉我它需要的不仅仅是一个关键部分,也许是一个信号量或“使用计数器”,也许其中之一与 CS结合使用。
我只是不太确定从哪里开始-从英语的整体方法到伪代码,再到 delphi 实现或外部链接,将不胜感激。
c++ - 这一小段互斥代码有什么问题?
使用Entrek Codesnitch软件调试和测试是否有内存泄漏等,报如下错误:
也许我所有的不眠之夜终于来到了我身边。但我不明白它到底在抱怨什么。有任何想法吗?
c++ - 使用 EnterCriticalSection 的问题
我需要处理来自多个线程的数组,因此我使用 CRITICAL SECTION 为其提供对数据的独占访问权限。
这是我的模板:
在编译时,我在调用EnterCriticalSection(&cs)
and时遇到了这样的问题LeaveCriticalSection(&cs)
:
我不知道出了什么问题。也许你可以看到。只是因为我一直这样用它,没关系。windows.h
已经包括了
c++ - 关键部分 - 是还是不是?
我正在使用 WinSock2 和 WinAPI 函数编写聊天。我有一点麻烦。
我将客户端连接的 std::vector 存储在服务器上。当新客户端连接时,新线程启动并且与客户端的所有工作都在这个新线程中完成。我不使用类(我知道它不是很好)所以这个连接列表只是定义为全局变量。
在我看来,可能是多个线程尝试同时访问此列表的情况。虽然我没有注意到有任何问题,但我是否需要做这样的事情:
那么,我的情况需要使用 CRITICAL_SECTION 吗?我只是没有发现错误的幸运儿吗?
.net - “Critical Section”、“Critical Region”和“Constrained Execution Region”的区别
这实际上是三个不同的概念还是我变得混乱?(我一直在阅读有关线程和垃圾收集的文章,并让自己感到困惑。)
“关键部分” - 我认为这可能只是您不希望多个线程同时访问的代码部分的术语,即在 lock 和 Monitor.Enter/Exit 语句中?
“关键区域” ——这里没有真正的线索——MSDN 说了类似“这告诉主机在该部分中抛出的异常可能会产生更广泛的影响”。并且“CLR 的主机,例如 Sql Server”可以选择“以不同的方式”处理关键区域内抛出的异常。不一样怎么办?为什么?而且,最重要的是,在哪些现实世界场景中,我可能需要将代码标记为关键区域?
“受约束的执行区域” - 我在阅读垃圾收集文章中的 CriticalFinalizerObject 时遇到了这个问题。
我可以从 MSDN 中了解到,这些区域之一中的代码以某种方式保证运行(但如何运行?),因此不得抛出“带外”异常。
什么是out-of-band exception
? (我确实在谷歌上搜索过,但它只是问我是否是指“越界异常”)。
是否有任何未处理的异常?还是只有某些类型的例外?再一次,最重要的是,在哪些现实世界场景中我可能需要“受约束的执行区域”?
由于我完全不了解这些概念,因此我不确定这个问题除了“.NET”之外还需要什么标签。
windows - 避免关键部分的重新初始化
我有一个创建全局临界区、初始化并使用它的 dll。
现在第三方应用程序多次使用/加载 dll,这会导致堆损坏。
appverifier警告我
--> VERIFIER STOP 00000211:pid 0x1470:关键部分已经初始化。<--
使用全局标志来检查临界区对象是否已经初始化并没有帮助,有什么想法可以完成同样的事情吗?
谢谢
delphi - 是否没有为在 Windows Server 2008 (sp1) 上运行的 Delphi 应用程序回收内存?
我们有一个 D2007 应用程序,它在 Windows Server 2008(x64,sp1)上运行时内存占用量稳定增长。
它在 Windows Server 2003(x32 或 x64)、XP 等上正常运行......它按预期上升和下降。
我们已经尝试使用包含的内存管理器或最新的 FastMM4 4.92,结果相同。
有没有人试图在 Win2008 上监控任何 Delphi 应用程序的内存使用情况并确认?
或者会有什么线索?
精度:
- 没有一般意义上的内存泄漏(是的,我对 FastMM 等人非常熟悉)
- 使用 Process Explorer 监控内存使用情况;虚拟内存(私有字节)和物理内存(WorkingSet Private)在 Win2008 上都在增长
- 即使存在内存压力,内存消耗仍在增长。(这就是我们来调查的原因,因为它导致了失败,但仅限于 Win2008 机器)
更新: //** repaced **// 代码比我们的应用程序简单得多,但表现出相同的行为。
创建一个包含 10,000,000 个对象和 10,000,000 个接口的列表,执行 2 次后,在 Windows Server 2008 上执行 100 次后,使用的内存将增加约 60MB 和大约 300MB,但只是返回到它在 XP 上的位置。
如果您启动多个实例,则不会释放内存以允许其他实例运行。相反,页面文件增长并且服务器爬网......
更新 2:见QC 报告 73347
经过进一步调查,我们已将其追踪到关键部分,如下面的代码所示。
将该代码放入带有 Button 的简单 VCL 应用程序中。并使用 Process Explorer 进行监控:
它从 ~2.6 MB 开始,运行 5 次后(单击按钮)保持在 ~118.6MB。
在 5 次执行中丢失了 116MB。
windows-vista - Vista/Win2008 上的关键部分泄漏内存?
似乎在 Vista/Windows Server 2008 中大量使用关键部分会导致操作系统无法完全恢复内存。我们在 Delphi 应用程序中发现了这个问题,这显然是因为使用了 CS API。(见这个问题)
有没有其他人在使用其他语言(C++,...)开发的应用程序中看到它?
示例代码只是初始化 10000000 CS,然后删除它们。这在 XP/Win2003 中运行良好,但在应用程序结束之前不会释放 Vista/Win2008 中的所有峰值内存。
您使用 CS 的次数越多,您的应用程序就会越多地保留内存。
c++ - 关键部分总是更快吗?
我正在调试一个多线程应用程序,发现CRITICAL_SECTION
. 我发现LockSemaphore
CRITICAL_SECTION 的数据成员很有趣。
它看起来像是LockSemaphore
一个自动重置事件(不是顾名思义的信号量),操作系统在第一次等待Critcal Section
被其他线程锁定的线程时静默创建此事件。
现在,我想知道关键部分总是更快吗?事件是一个内核对象,每个关键部分对象都与事件对象相关联,那么Critical Section
与其他内核对象(如 Mutex)相比,如何更快?此外,内部事件对象实际上如何影响关键部分的性能?
这是 的结构CRITICAL_SECTION
: