问题标签 [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.

0 投票
2 回答
294 浏览

multithreading - 多线程间数据访问同步

我正在尝试在 Visual C++ 中实现多线程、递归文件搜索逻辑。逻辑如下:线程 1,2 将从目录位置开始,并将目录中存在的文件与搜索条件进行匹配。如果他们找到子目录,他们会将其添加到工作队列中。一旦线程完成了目录中的文件,它就会从工作队列中获取另一个目录路径。工作队列是一个 STL Stack 类,由用于 push()、pop()、top() 调用的 CriticalSections 保护。

如果堆栈在任何时候为空,线程将在重试之前等待一分钟。此外,当所有线程都处于等待状态时,搜索被标记为完成。

这个逻辑没有任何问题,但我觉得我没有获得使用线程的全部潜力,因为与使用单线程相比没有显着的性能提升。我觉得工作堆栈是瓶颈,但无法弄清楚如何消除锁定部分。我尝试了另一种变体,其中每个线程将拥有自己的堆栈,并且仅当本地堆栈大小超过固定数量的工作项时,才会将工作项添加到全局堆栈。如果本地堆栈为空,线程将尝试从全局队列中获取。即使有这种变化,我也没有发现明显的差异。有没有人对改进同步逻辑有任何建议。

问候,

0 投票
2 回答
2852 浏览

delphi - 我可以嵌套关键部分吗?TCriticalSection 是可嵌套的吗?

我希望有两个可以相互调用的过程,或者从正在运行的任何线程中调用,但一次只能运行一个。我怎样才能做到这一点?这会正常工作吗?

0 投票
2 回答
1228 浏览

c++ - COM - _pAtlModule->Lock() 究竟锁定了什么?

我正在学习编写 COM 控件。我有一个示例项目,它使用线条

分别在 COM 控件的 OnCreate() 处理程序和 OnDestroy() 处理程序中。

我意识到 _pAtlModule 是 CAtlModule 的一个实例——“应用程序”对象(因为需要更好的描述)。

但是对于我的问题。_pAtlModule->Lock() 究竟锁定了什么?我知道这是一个关键部分,但它保护的是什么?

编写 COM 控件时必须锁定和解锁 _pAtlModule 对象吗?

谢谢!

0 投票
5 回答
4452 浏览

multithreading - Delphi:通过报告锁定“失败”时运行线程的调用堆栈来调试关键部分挂起

我正在寻找一种方法来调试罕见的 Delphi 7 关键部分 (TCriticalSection) 挂起/死锁。在这种情况下,如果一个线程在关键部分等待超过 10 秒,我想生成一个报告,其中包含当前锁定关键部分的线程以及未能能够的线程的堆栈跟踪等待 10 秒后锁定临界区。如果引发异常或应用程序终止,则可以。

如果可能的话,我宁愿继续使用临界区,而不是使用其他同步原语,但可以在必要时切换(例如获得超时功能)。

如果该工具/方法在 IDE 之外的运行时工作,这是一个好处,因为这很难按需重现。在极少数情况下,我可以在 IDE 中复制死锁,如果我尝试暂停以开始调试,IDE 只是坐在那里什么都不做,并且永远不会进入我可以查看线程或调用堆栈的状态。不过,我可以重置正在运行的程序。

更新:在这种情况下,我只处理一个关键部分和 2 个线程,所以这可能不是锁排序问题。我相信有一个不正确的嵌套尝试跨两个不同的线程进入锁,这会导致死锁。

0 投票
4 回答
6414 浏览

java - Java,多线程,一次只执行一个

我正在处理一项任务,必须创建两个类,一个代表一个人,另一个代表一座桥。任何时候只有一个人可以“过”桥,但可能有人在等待过桥

我通过多线程轻松实现了这一点,允许多人同时交叉,但是在将其更改为只允许一个线程运行时遇到问题......

我的主要问题是他们想要的类设计,我必须在 person 类中启动线程,但是 bridge 类需要能够等待并通知他们启动/停止

任何想法我怎么能做到这一点?

0 投票
5 回答
3000 浏览

c++ - critical section problem in Windows 7

Why does the code sample below cause one thread to execute way more than another but a mutex does not?

0 投票
3 回答
709 浏览

multithreading - 我可以获得包含关键部分的线程的 id 吗?

我想围绕一段复杂的多线程代码编写一些断言。有没有办法做一个

0 投票
2 回答
1877 浏览

c++ - 场景:多线程应用程序使用的 DLL 中的全局变量

几个月前,我遇到了一个人(在 orkut 上)提出的这个有趣的场景。虽然,我已经为这个问题提出了一个“非便携式”解决方案(已经用小代码测试过),但仍然想知道你们要说什么和建议什么。

假设,我为单线程客户端创建了一个 DLL,导出了一些用 C++ 编写的功能。该 DLL 声明了许多全局变量,一些可能是 const 变量(只读),而另一些则是可修改的。

无论如何,后来事情发生了变化,现在我希望同一个 DLL 与多线程应用程序一起工作(无需修改 DLL);这意味着,多个线程从 DLL 访问函数和全局变量,并修改它们......等等。所有这些都可能导致全局变量持有不一致的值。

所以问题是,

我们是否可以在客户端代码中做一些事情来防止 DLL 的多访问,同时确保每个线程在它自己的上下文中运行(意思是,当它访问 DLL 时,DLL 的全局值与那是以前)?

0 投票
2 回答
1789 浏览

c++ - 通过继承而不是组合锁定

在我编写或查看的大多数代码中,锁定是通过组合实现的,其中一个类拥有一个临界区或互斥锁:

当可以通过多个线程访问可变成员时,我们通过 RAII 获取和释放锁,如下所示:

今天我回顾了一些通过继承实现锁定的代码,如下所示:

并且锁定由类锁定“本身”执行:

这种方法有什么优点或缺点吗?或者这只是一个风格问题?

0 投票
2 回答
12478 浏览

c++ - 多线程和关键部分的使用 - C++

对于在多线程应用程序中正确使用关键部分,我有点困惑。在我的应用程序中,有几个对象(一些循环缓冲区和一个串行端口对象)在线程之间共享。对这些对象的访问应该始终放在关键部分,还是只在特定时间?我怀疑只是在某些时候,因为当我尝试用EnterCriticalSection/包装每次使用时,LeaveCriticalSection我遇到了似乎是死锁的情况。您可能拥有的任何见解将不胜感激。谢谢。