问题标签 [multithreading]

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 投票
6 回答
8627 浏览

windows - 如何从磁盘获得良好的并发读取性能

我想问一个问题,然后用我自己的答案跟进,但也看看其他人有什么答案。

我们有两个大文件,我们想同时从两个单独的线程中读取它们。一个线程将顺序读取fileA,而另一个线程将顺序读取fileB。线程之间没有锁定或通信,它们都在尽可能快地顺序读取,并且都立即丢弃它们读取的数据。

我们在 Windows 上使用此设置的经验非常差。两个线程的总吞吐量约为 2-3 MiB/sec。驱动器似乎花费了大部分时间在两个文件之间来回搜索,可能在每次搜索后读取的很少。

如果我们禁用其中一个线程并暂时查看单个线程的性能,那么我们将获得更好的带宽(这台机器约为 45 MiB/秒)。很明显,糟糕的双线程性能是 OS 磁盘调度程序的产物。

我们可以做些什么来提高并发线程读取性能? 也许通过使用不同的 API 或以某种方式调整 OS 磁盘调度程序参数。

一些细节:

在具有 2GiB 内存的机器上,这些文件的大小约为 2GiB。出于这个问题的目的,我们认为它们没有被缓存和完美碎片整理。我们使用了碎片整理工具并重新启动以确保是这种情况。

我们没有使用特殊的 API 来读取这些文件。该行为可在各种标准 API 中重复,例如 Win32 的 CreateFile、C 的 fopen、C++ 的 std::ifstream、Java 的 FileInputStream 等。

每个线程都在循环中旋转,调用 read 函数。我们将每次迭代从 API 请求的字节数从 1KiB 到 128MiB 不等。改变这个没有任何效果,所以很明显,操作系统在每次磁盘寻道后物理读取的数量不是由这个数字决定的。这正是应该预期的。

在 Windows 2000、Windows XP(32 位和 64 位)、Windows Server 2003 以及使用和不使用硬件 RAID5 的情况下,单线程和双线程性能之间的巨大差异是可以重复的。

0 投票
15 回答
25681 浏览

c# - 访问 C# 中的变量是原子操作吗?

我一直相信,如果多个线程可以访问一个变量,那么对该变量的所有读取和写入都必须受到同步代码的保护,例如“锁定”语句,因为处理器可能会在中途切换到另一个线程一个写。

但是,我正在使用 Reflector 查看 System.Web.Security.Membership 并找到如下代码:

为什么 s_Initialized 字段在锁之外读取?其他线程不能同时尝试写入它吗?变量的读写是原子的吗?

0 投票
7 回答
2639 浏览

multithreading - 分析多线程程序

我们有一个已有数年历史的代码库,所有原始开发人员早已不复存在。它使用很多很多线程,但没有明显的设计或通用的架构原则。每个开发人员都有自己的多线程编程风格,因此一些线程使用队列相互通信,一些使用互斥锁锁定数据,一些使用信号量锁定,一些使用操作系统 IPC 机制进行进程内通信。没有设计文档,评论也很少。这是一团糟,似乎每当我们尝试重构代码或添加新功能时,都会引入死锁或其他问题。

那么,有没有人知道任何有助于分析和记录线程之间所有交互的工具或技术?FWIW,代码库是 Linux 上的 C++,但我有兴趣了解其他环境的工具。


更新

我很欣赏到目前为止收到的回复,但我希望得到比基本上是“添加日志消息、弄清楚发生了什么并修复它”的建议更复杂或更系统的东西。有很多工具可以用来分析和记录单线程程序中的控制流。多线程程序没有可用的东西吗?


另请参阅调试多线程应用程序

0 投票
3 回答
4541 浏览

c# - Compact Framework/Threading - 选择选项后,MessageBox 显示在其他控件之上

我正在开发一个应用程序,该应用程序可以从外部服务器获取并安装大量更新,并且需要一些线程方面的帮助。用户遵循这个过程:

  • 点击按钮
  • 方法检查更新,返回计数。
  • 如果大于 0,则询问用户是否要使用 MessageBox.Show() 进行安装。
  • 如果是,它会运行一个循环并在每次更新的 run() 方法上调用 BeginInvoke() 以在后台运行它。
  • 我的更新类有一些用于更新进度条等的事件。

进度条更新很好,但 MessageBox 没有从屏幕上完全清除,因为更新循环在用户单击是后立即开始(见下面的屏幕截图)。

  • 我应该怎么做才能使消息框在更新循环开始之前立即消失?
  • 我应该使用线程而不是 BeginInvoke() 吗?
  • 我应该在单独的线程上进行初始更新检查并从该线程调用 MessageBox.Show() 吗?

代码

截屏

Windows 移动错误

0 投票
4 回答
707 浏览

.net - 多线程设计最佳实践

考虑这个问题:我有一个程序应该从数据库中获取(比方说)100 条记录,然后对于每条记录,它应该从 Web 服务中获取更新的信息。在这种情况下,有两种方法可以引入并行性:

  1. 我在一个新线程上启动对 Web 服务的每个请求。同时线程的数量由一些外部参数控制(或以某种方式动态调整)。

  2. 我创建较小的批次(假设每个 10 条记录)并在单独的线程上启动每个批次(以我们的示例为例,10 个线程)。

哪种方法更好,您为什么这么认为?

0 投票
9 回答
16237 浏览

c# - 什么时候不应该在 .Net 中使用 ThreadPool?

什么时候不应该在 .Net 中使用 ThreadPool?

看起来最好的选择是使用线程池,在这种情况下,为什么它不是唯一的选择?

您对此有何经验?

0 投票
7 回答
7869 浏览

winforms - 在 WinForms 中,为什么不能从其他线程更新 UI 控件?

我确信这有一个很好的(或至少体面的)理由。它是什么?

0 投票
6 回答
1566 浏览

windows - Windows 窗体线程和事件 - ListBox 及时更新,但进度条出现巨大延迟

我们的团队正在创建一个新的招聘工作流程系统来替换旧的。我的任务是将旧数据迁移到新模式中。我决定通过创建一个小型 Windows 窗体项目来做到这一点,因为架构完全不同,直接的 TSQL 脚本不是一个合适的解决方案。

完成这项工作的主要密封类“ImportController”声明了以下委托事件:

主窗口使用新线程在该类中启动一个静态方法:

ImportProgressEvent 参数携带字符串消息、进度条的最大 int 值和当前进度 int 值。Windows 窗体订阅该事件:

并使用它自己的委托以这种方式响应事件:

最后更新进度条和列表框:

问题是 ListBox 似乎更新得很快,但进度条永远不会移动,直到批处理几乎完成?是什么赋予了 ?

0 投票
27 回答
187730 浏览

multithreading - 我应该如何对多线程代码进行单元测试?

到目前为止,我已经避免了测试多线程代码的噩梦,因为它看起来像是一个雷区。我想问一下人们是如何测试依赖线程成功执行的代码的,或者人们是如何测试那些仅在两个线程以给定方式交互时才出现的问题的?

对于今天的程序员来说,这似乎是一个非常关键的问题,将我们的知识集中在这个恕我直言上会很有用。

0 投票
5 回答
12447 浏览

asp.net - 为什么我的 asp.net 应用程序抛出 ThreadAbortException?

这是一个不言自明的问题:

为什么即使没有任何问题,这个东西也会冒泡到我的 try catch 中?

为什么它会在我的日志中出现数百次?

我知道这是一个新手问题,但如果这个网站要获得搜索排名并吸引新手,我们必须问他们