问题标签 [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 投票
15 回答
37853 浏览

Win32下的堆损坏;如何定位?

我正在开发一个破坏堆的多线程C++ 应用程序。定位这种损坏的常用工具似乎不适用。源代码的旧版本(18 个月大)表现出与最新版本相同的行为,所以这已经存在很长时间了,只是没有被注意到;不利的一面是,源增量不能用于识别何时引入错误 -存储库中有很多代码更改。

崩溃行为的提示是在该系统中生成吞吐量 - 数据的套接字传输,该数据被转换为内部表示。我有一组测试数据会定期导致应用程序异常(各种地方,各种原因 - 包括堆分配失败,因此:堆损坏)。

该行为似乎与 CPU 功率或内存带宽有关;每台机器拥有的越多,就越容易崩溃。禁用超线程内核或双核内核会降低(但不会消除)损坏率。这暗示了一个与时间相关的问题。

现在问题来了:
当它在轻量级调试环境(比如Visual Studio 98 / AKA MSVC6)下运行时,堆损坏相当容易重现 - 十到十五分钟后,某些事情会发生可怕的失败和异常,例如alloc;在复杂的调试环境下运行时(Rational Purify,VS2008/MSVC9甚至微软应用程序验证程序)系统成为内存速度限制并且不会崩溃(内存限制:CPU没有超过50%,磁盘灯不亮,程序运行速度尽可能快,消耗1.3G2G RAM的盒子) . 因此,我可以在能够重现问题(但不能识别原因)或能够识别原因或我无法重现的问题之间做出选择。

我目前对下一步的最佳猜测是:

  1. 获得一个疯狂的盒子(替换当前的开发盒:2Gb RAM in an E6550 Core2 Duo);这将使在强大的调试环境下运行时重现导致错误行为的崩溃成为可能;或者
  2. 重写操作符new,并delete在完成后立即使用VirtualAlloc并将VirtualProtect内存标记为只读。运行MSVC6并让操作系统捕获正在写入释放内存的坏人。是的,这是绝望的迹象:到底是谁重写newdelete?!我想知道这是否会使它像 Purify 等人一样慢。

而且,不:不能选择内置 Purify 仪器。

一位同事刚刚走过,问“堆栈溢出?我们现在堆栈溢出了吗?!?”

现在,问题是:我如何找到堆损坏器?


更新:平衡new[]delete[]似乎在解决问题方面取得了长足的进步。现在,该应用程序在崩溃前大约需要两个小时,而不是 15 分钟。还没有。有什么进一步的建议吗?堆损坏仍然存在。

更新:Visual Studio 2008 下的发布版本似乎要好得多;STL目前的怀疑取决于VS98.


  1. 重现问题。Dr Watson将产生一个可能有助于进一步分析的转储。

我会记下这一点,但我担心 Watson 博士只会在事后被绊倒,而不是在堆被踩踏时。

另一种尝试可能是WinDebug用作调试工具,它非常强大,同时也是轻量级的。

现在又开始了:在出现问题之前没有太多帮助。我想在行为中抓住破坏者。

也许这些工具至少可以让您将问题缩小到某个组件。

我不抱太大希望,但绝望的时候需要...

您确定项目的所有组件都具有正确的运行时库设置(C/C++ tabVS 6.0 项目设置中的代码生成类别)吗?

不,我不是,明天我将花几个小时浏览工作区(其中有 58 个项目)并检查它们是否都在编译并与适当的标志链接。


更新:这需要 30 秒。选择对话框中的所有项目Settings,取消选择,直到找到没有正确设置的项目(它们都有正确的设置)。

0 投票
17 回答
10071 浏览

有哪些学习线程编程的好资源?

随着桌面多核 CPU 的兴起,多线程技能将成为程序员的宝贵财富。你能为想要学习线程编程的程序员推荐一些好的资源(书籍、教程、网站等)吗?

0 投票
6 回答
32841 浏览

如何使事件回调进入我的 win 表单线程安全?

当您从表单中订阅对象上的事件时,您实际上是将回调方法的控制权交给了事件源。您不知道该事件源是否会选择在不同的线程上触发事件。

问题是,当调用回调时,您不能假设可以在表单上创建更新控件,因为有时如果在与运行表单的线程不同的线程上调用事件回调,这些控件会引发异常。

0 投票
8 回答
1508 浏览

在多核机器上扩展多线程应用程序

我正在做一个项目,我们需要更多的性能。随着时间的推移,我们继续改进设计以更多地并行工作(线程和分布式)。然后最新的步骤是将其中的一部分移到具有 16 个内核的新机器上。我发现我们需要重新考虑如何在共享内存模型中扩展至那么多内核。例如,标准内存分配器不够好。

人们会推荐什么资源?

到目前为止,我发现 Sutter 的专栏 Dr. Dobbs 是一个好的开始。我刚拿到多处理器编程的艺术和关于英特尔线程构建块的 O'Reilly 书

0 投票
3 回答
16421 浏览

如何在继续之前等待线程完成?

我有一些用于在 .NET CF 2.0 上启动线程的代码:

如果我在循环中调用它,则项目完全乱序。如何引入 wait after t.Start(),以便在代码继续之前完成线程上的工作?BeginInvoke/EndInvoke 会比手动创建线程更好吗?

0 投票
9 回答
26328 浏览

C++ 中单例的线程安全惰性构造

有没有办法在 C++ 中实现单例对象:

  1. 以线程安全的方式懒惰地构造(两个线程可能同时是单例的第一个用户 - 它仍然应该只构造一次)。
  2. 不依赖于预先构造的静态变量(因此在构造静态变量期间单例对象本身可以安全使用)。

(我不太了解我的 C++,但是在执行任何代码之前是否初始化了整数和常量静态变量(即,甚至在执行静态构造函数之前 - 它们的值可能已经在程序中“初始化”了)图像)?如果是这样 - 也许可以利用它来实现单例互斥锁 - 这又可以用来保护真正单例的创建..)


太好了,看来我现在有几个很好的答案(很遗憾我不能将 2 或 3 标记为答案)。似乎有两种广泛的解决方案:

  1. 使用 POD 静态变量的静态初始化(与动态初始化相反),并使用内置原子指令实现我自己的互斥锁。这是我在问题中暗示的解决方案类型,我相信我已经知道了。
  2. 使用其他一些库函数,例如pthread_onceboost::call_once。这些我当然不知道 - 并且非常感谢发布的答案。
0 投票
2 回答
1725 浏览

有人用过谷歌性能工具吗?

寻找有关以下方面的反馈:

http://code.google.com/p/google-perftools/wiki/GooglePerformanceTools

0 投票
7 回答
2892 浏览

多核文本文件解析

我有一台四核机器,想编写一些代码来解析一个利用所有四核的文本文件。文本文件基本上每行包含一条记录。

多线程不是我的强项,所以我想知道是否有人可以给我一些我可以用来以最佳方式解析文件的模式。

我的第一个想法是将所有行读入某种队列,然后启动线程以将行从队列中拉出并处理它们,但这意味着队列必须存在于内存中,而且这些文件相当大,所以我我不那么热衷于这个想法。

我的下一个想法是拥有某种控制器,它将读取一行并为其分配一个线程来解析,但我不确定如果线程处理行的速度比它可以更快,控制器是否最终会成为瓶颈阅读并分配它们。

我知道可能还有比这两个更简单的解决方案,但目前我只是没有看到它。

0 投票
10 回答
65902 浏览

C# 静态构造函数线程安全吗?

换句话说,这个 Singleton 实现线程是否安全:

0 投票
5 回答
29385 浏览

C# 中是否有“尝试锁定,如果超时则跳过”操作?

我需要尝试锁定一个对象,如果它已经锁定就继续(超时后,或者没有它)。

C# lock 语句被阻塞。