问题标签 [concurrency]

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 回答
682 浏览

.net - 人们正在使用 Jeffrey Richter 的 PowerThreading 库中的哪些类?

Jeffrey Richter 正在寻找有关人们如何使用他的 PowerThreading 库的一些信息。如果有人在使用它,您使用的是它的哪些部分?他正在清理图书馆并想知道人们正在使用哪些类。

http://www.wintellect.com/PowerThreading.aspx

编辑:见http://tech.groups.yahoo.com/group/PowerThreading/message/88

0 投票
7 回答
9449 浏览

java - 如何包装一个方法,以便在它超过指定的超时时终止它的执行?

我有一个我想调用的方法。但是,如果执行时间过长,我正在寻找一种干净、简单的方法来杀死它或强制它返回。

我正在使用 Java。

为了显示:

我认为这TestExecutor门课应该implement Callable并继续朝着这个方向前进。

但我想做的就是executor.execute()在时间太长时停下来。

建议...?

编辑

收到的许多建议都假设正在执行的需要很长时间的方法包含某种循环,并且可以定期检查变量。然而,这种情况并非如此。因此,某些不一定是干净的,并且只会在可以接受的地方停止执行。

0 投票
8 回答
3875 浏览

java - Java HashMap 中的线程问题

发生了一些我不确定是否可能发生的事情。显然是的,因为我已经看到了,但是我需要找到根本原因,希望大家能提供帮助。

我们有一个系统可以查找邮政编码的纬度和经度。我们不是每次都访问它,而是将结果缓存在一个廉价的内存中 HashTable 缓存中,因为邮政编码的纬度和经度往往比我们发布的更频繁。

无论如何,散列被一个类包围,该类具有同步的“get”和“add”方法。我们作为单例访问这个类。

我并不是说这是最好的设置,但它就是我们所处的位置。(我计划尽快更改以将 Map 包装在 Collections.synchronizedMap() 调用中。)

我们在多线程环境中使用此缓存,其中线程 2 调用 2 个 zip(因此我们可以计算两者之间的距离)。这些有时几乎同时发生,因此两个调用很可能同时访问地图。

就在最近,我们发生了一个事件,两个不同的邮政编码返回相同的值。假设初始值实际上不同,有没有办法将值写入 Map 会导致为两个不同的键写入相同的值?或者,有什么方法可以让 2 个“获取”跨线并意外返回相同的值?

我唯一的其他解释是初始数据已损坏(错误值),但这似乎不太可能。

任何想法,将不胜感激。谢谢,彼得

(PS:如果您需要更多信息、代码等,请告诉我)

0 投票
5 回答
2074 浏览

java - 代码性能比较,线程与非线程

假设以下代码,我有一些与线程相关的问题。请忽略代码可能效率低下,我只对线程部分感兴趣。

如果我运行这样的代码,大约需要 56 秒。但是,如果我有以下代码(作为替代):

整个操作大约需要 7 秒。我几乎可以肯定,即使我一次只创建一个线程,一个线程并不总是在创建另一个线程时完成。是对的吗?我也很好奇:为什么手术结束的这么快?

当我加入一个线程时,其他线程是否继续在后台运行,还是加入的线程是唯一一个在运行的线程?

0 投票
15 回答
1716 浏览

multithreading - 确保线程安全的最佳编程方法/方法

当我从大约 20 年的基本、Pascal、COBOL 和 C 过程编程的背景中学习 Java 时,我当时认为最难的事情是围绕 OOP 术语和概念来思考。现在有了大约 8 年的扎实 Java 经验,我得出的结论是,使用 Java 和类似的语言(如 C#)进行编程最困难的事情就是多线程/并发方面。

编写可靠且可扩展的多线程应用程序非常困难!随着处理器发展“更宽”而不是更快的趋势,它正迅速变得非常关键。

当然,最难的领域是控制线程之间的交互以及由此产生的错误:死锁、竞争条件、陈旧数据和延迟。

所以我的问题是:你采用什么方法或方法来生成安全的并发代码,同时减少死锁、延迟和其他问题的可能性?我提出了一种有点非传统的方法,但在几个大型应用程序中效果很好,我将分享这个问题的详细答案。

0 投票
9 回答
567 浏览

mysql - 使用文件系统与 RDMBS (MySQL) 进行并发处理

我正在构建一个英语网络词典,用户可以在其中输入单词并获取定义。我考虑了一段时间,因为数据是 100% 静态的,而且我一次只能检索一个单词,所以最好使用文件系统 (ext3) 作为数据库系统,而不是选择使用 MySQL 来存储定义。考虑到您必须连接到 MySQL 并且这本身是一个非常缓慢的操作,我认为开销会更少。

我担心的是,如果我的系统受到 500 字检索/秒的轰炸,我还是将文件系统用作数据库会更好吗?或者增加的文件系统读取会阻碍性能,而不是 MySQL 可能在幕后做的事情?

目前,层次结构由单词的第一个字母、第二个字母和第三个字母分割。因此,如果您要搜索“水”的定义,脚本 (PHP) 将尝试从“../dict/w/a/t/water.word”中读取(在清理有问题的单词和小写)

我是朝着正确的方向前进还是有更快的解决方案(不计算使用 memcached 之类的东西在内存中存储定义)?存储在任何目录中的文件数量是否会影响性能?我应该在目录中存储的文件数量的粗略基准是什么?

0 投票
4 回答
3107 浏览

c# - 串口和蓝屏

我编写了一些 C# 代码,通过在端口上发出命令并侦听回复来检查设备是否存在于任何 SerialPort 上。当我只是设置端口速度,打开端口,获取串行流并开始处理时,它的工作时间是 100%。但是,我们的一些设备以不同的速度工作,我正在尝试以不同的速度探测设备以自动协商连接并检测设备的存在。

当我在一个线程中完成所有这些操作时,没有任何问题。但是十速下的3s超时是每个串口30s,可能有几个。因此希望同时探测所有端口。

有时这有效。有时 Vista 蓝屏。当我使用线程同时探测所有端口时,它几乎总是蓝屏。当我强迫一切都在一个线程中运行时,它永远不会发生。

USB 串行 Prolific PL-2303 适配器与 x64 驱动程序一起使用。


@Vinko - 感谢您提供有关阅读小型转储的提示。

据我所知,问题的症结在于,通过从不同的线程启动新的异步 I/O 操作,可以为重叠 I/O 赋予全新的含义,从而在驱动程序内部引发竞争条件。由于驱动程序在内核模式下执行,BLAM!

结语

除了开始之外,不要在回调处理程序之外使用 BeginXxx,并且在调用 EndXxx 之前不要调用 BeginXxx,因为你会在内核模式下运行的驱动程序代码中引发竞争条件。

后记

我发现这也适用于套接字流。

0 投票
17 回答
210686 浏览

multithreading - 术语“线程安全”是什么意思?

这是否意味着两个线程不能同时更改底层数据?或者这是否意味着当多个线程正在执行该代码段时,给定的代码段将以可预测的结果运行?

0 投票
11 回答
6769 浏览

c++ - 并发数据结构设计

我正在尝试提出用于高吞吐量 C++ 服务器的最佳数据结构。该数据结构将用于存储从几到几百万个对象的任何内容,并且不需要排序(尽管可以非常便宜地提供唯一的排序键)。

要求是它可以支持高效的插入,理想情况下为 O(1),中等效率的移除和高效的遍历。它不需要支持查找操作(除了可能需要删除)。

扭曲是它必须是线程安全的,而其他线程正在枚举数据结构。这意味着简单的红黑树不起作用,因为一个线程无法插入元素(并执行必要的树旋转)而不会弄乱其他线程持有的任何游标。

使用读/写锁并将写操作推迟到所有读者都完成是不可接受的,因为读操作可能会长期存在。有读者时发生的插入是否对该读者可见并不重要。

内存占用也很重要,当然越小越好!

有什么建议?

回复评论:

感谢您的回答。

不,插入不能使现有的迭代器无效。迭代器可能会或可能不会看到新的插入,但他们必须看到如果插入没有发生,他们会看到的所有内容。

需要删除,但是由于更高级别的规则,我可以保证迭代器永远不会在可删除的项目上停止。

为游标锁定每个节点会对性能产生太大影响。可能有多个线程同时读取,并且多个线程在锁中使用的任何类型的内存热点都会杀死内存带宽(正如我们发现的那样困难!)。即使是具有多个调用 InterlockedIncrement 的线程的读取器的简单计数也无法干净地扩展。

我同意链接列表可能是最好的方法。删除很少见,因此为支持 O(1) 删除的反向指针支付内存代价是昂贵的,我们可以根据需要单独计算这些,因为删除往往是批处理操作。

幸运的是,插入到链表中不需要对读取器进行任何锁定,只要在更改头指针之前在插入的节点中更新指针即可。

锁定-复制-解锁的想法很有趣。所涉及的数据量太大,无法将其用作读取器的默认设置,但是当写入器与读取器发生冲突时,它可以用于写入器。读/写锁将保护整个结构,如果与读取器发生冲突,写入将克隆数据结构。写入比读取少得多。

0 投票
14 回答
74384 浏览

java - 什么时候调用 java 的 thread.run() 而不是 thread.start()?

您什么时候会调用 Javathread.run()而不是thread.start()