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

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

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

0 投票
3 回答
597 浏览

concurrency - 文档服务器:处理并发保存

我正在实现一个文档服务器。目前,如果两个用户打开同一个文档,然后对其进行修改并保存更改,则文档的状态将是未定义的(第一个用户的更改被永久保存,或者第二个用户的更改)。这完全不能令人满意。我考虑了解决这个问题的两种可能性:

第一种是第一次打开文档时锁定,关闭时解锁。但如果与服务器的网络连接突然中断,文档将处于永久锁定状态。显而易见的解决方案是定期向服务器发送 ping。如果服务器没有连续接收到来自特定客户端的 K 个 ping (K > 1),则由该客户端锁定的文档将被解锁。如果该客户再次出现,文档将再次被锁定,如果有人尚未锁定它们。如果客户端应用程序(在 Web 浏览器中运行)意外终止,这也可能会有所帮助,从而无法向服务器发送“退出,解锁我的文档”信号。

二是存储不同用户保存的同一文档的多个版本。如果快速连续地对文档进行更改,系统将提供合并版本或选择首选版本。为了优化存储空间,应该只保留文档差异(就像源代码控制软件一样)。

考虑到与服务器的连接有时可能很慢且无响应,我应该选择哪种方法?应该如何确定参数(ping 间隔、快速连续间隔)?

PS 不幸的是,我无法将文档存储在数据库中。

0 投票
7 回答
2639 浏览

multithreading - 分析多线程程序

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

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


更新

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


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

0 投票
7 回答
4911 浏览

java - 暗星计划是否现实?

昨晚在纽约谷歌办公室举行的JavaSIG月度会议的主题是Project Darkstar 。对于那些不知道的人(可能是每个人),Project Darkstar 是一个大型多人在线游戏的框架,它试图处理所有“困难的事情”。基本思想是您编写游戏服务器逻辑的方式是将所有操作分解为小任务。您将这些任务传递给 Project Darkstar 框架,该框架处理将它们分发到集群中的特定节点、任何并发问题,并最终持久化数据。

显然,做这种事情对于视频游戏来说是一个与企业应用程序大不相同的问题。演讲的 Jim Waldo 声称,MMO 游戏的 DB 读/写比率为 50/50,而企业应用程序更像是 90% 读取,10% 写入。他还声称,大多数现有的 MMO 将所有内容都单独保存在内存中,并且每 6 小时才转储到数据库中。这意味着如果服务器出现故障,您将丢失自上次数据库转储以来的所有工作。

现在,这个项目本身听起来很酷,但我认为业界不会接受它。首先,您必须用 Java 编写服务器代码。客户端代码可以用任何东西编写(Jim 声称 ActionScript 3 是最流行的,其次是 C++),但服务器代码必须是 Java。听起来不错,但我真的觉得游戏行业的每个人都讨厌 Java。

其次,与其他行业的开发人员更喜欢使用现有的框架和库不同,游戏行业的人似乎喜欢自己编写所有东西。不仅如此,他们还喜欢为他们制作的每款新游戏重写所有内容。在开发人员使用 Havok 进行物理、使用虚幻引擎 3 作为他们的平台等的地方,情况开始发生变化,但在大多数情况下,一切看起来仍然是专有的。

那么,暗星计划的人只是在浪费时间吗?像这样的通用框架真的可以用于具有所需性能的复杂游戏吗?即使它确实有效,游戏公司是否愿意使用它?

0 投票
13 回答
4060 浏览

multithreading - 其他语言的 Erlang 风格并发

其他编程语言有哪些库来提供 Erlang 风格的并发模型(进程、邮箱、模式匹配接收等)?

注意:我对旨在类似于 Erlang 的东西特别感兴趣,而不仅仅是任何线程或队列库。

0 投票
1 回答
7563 浏览

java - 在并发程序中从 BlockingQueue 获取对象的最佳方法?

在并发程序中从 BlockingQueue 中取出对象而不遇到竞争条件的最佳方法是什么?我目前正在执行以下操作,但我不相信这是最好的方法:

我还没有达到比赛条件......但是,我不太确定这是否真的安全。

0 投票
2 回答
530 浏览

.net - 处理文件系统更改的最佳架构?

这是场景:

我正在编写一个应用程序来监视特定目录中的任何更改。该目录每分钟将被数千个文件淹没,每个文件都有一个“几乎”唯一的 GUID。文件格式是这样的:

GUID.dat where GUID == xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(内部内容不相关,只是文本数据)

我的应用程序将是一个具有单个文本框的表单,该文本框显示所有实时添加和删除的文件。每次有新文件进入时,我都必须用这个文件更新文本框,但我必须首先确保这个半唯一的 GUID 真的是唯一的,如果是的话,用这个新文件更新文本框。

从该目录中删除文件时,请确保它存在,然后将其删除,并相应地更新文本框。

问题是我一直在使用 .NET 文件观察器,似乎每次进入 (buffersize + 1)-th 文件时都有一个内部缓冲区被炸毁。我还尝试在我的应用程序,只需添加每个传入的文件,但稍后执行唯一 GUID 检查,但不要骰子。

0 投票
18 回答
759236 浏览

multithreading - 什么是竞态条件?

在编写多线程应用程序时,最常见的问题之一是竞态条件。

我对社区的问题是:

  • 什么是比赛条件?
  • 你如何检测它们?
  • 你如何处理它们?
  • 最后,如何防止它们发生?
0 投票
17 回答
142417 浏览

multithreading - 什么是死锁?

在编写多线程应用程序时,最常见的问题之一是死锁。

我对社区的问题是:

  1. 什么是死锁?

  2. 你如何检测它们?

  3. 你会处理它们吗?

  4. 最后,您如何防止它们发生?

0 投票
15 回答
256737 浏览

multithreading - 什么是信号量?

信号量是一个经常用于解决多线程问题的编程概念。我对社区的问题:

什么是信号量以及如何使用它?