问题标签 [concurrent-programming]

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

java - 阻塞锁与非阻塞锁

我在这里想:如果您有 2 个线程执行需要同步的 FAST 操作,那么非阻塞方法不是比阻塞/上下文切换方法更快/更好吗?

通过非阻塞,我的意思是:

while(true) { if (checkAndGetTheLock()) 中断;}

如果您有太多线程围绕锁循环,我唯一能想到的就是饥饿(CPU 烧坏)。

我如何平衡一种方法与另一种方法?

0 投票
3 回答
6421 浏览

c# - Thread safe collection that supports removing items

I cannot seem to find a .NET thread safe / concurrent collect that supports a simple Remove() function where I can either remove a specific item or pass in a predicate to remove items based on that. I have tried:

Does anyone know of a collection that supports this behavior, or do I have to create my own?

I want to be able to grab the next item from a thread-safe queue without removing it, and later on if a certain condition is met, proceed with removing it.

0 投票
3 回答
2409 浏览

c++ - 两个进程之间如何通信

嗨,我正在开发一个 c++ 项目,我试图保持操作系统独立,并且我有两个需要通信的进程。我正在考虑设置第三个进程(可能作为服务?)来异步协调其他两个进程。

客户端 1 会在数据准备好时通知中间进程,并将数据发送给它。然后中间进程将保存这些数据,直到客户端 2 告诉它它已准备好接收数据。如果中间进程还没有收到来自客户端 1 的新数据,它会告诉客户端 2 等待。

由于我试图让这个操作系统保持独立,我真的不知道该使用什么。我已经研究过使用 MPI,但它似乎并不适合这个目的。我还研究了 Boost.ASIO、命名管道、RPC 和 RCF。我目前在 Windows 中编程,但我想避免使用 WIN_API,以便代码可能在 Linux 中编译。

下面是关于这两个过程的更多细节。

我们有一个后端进程/模型(客户端 1),它将通过中间进程从 GUI(客户端 2,用 Qt 编写)接收初始输入。然后模型将继续工作,直到满足结束条件,并在服务器准备好时将数据发送到服务器。GUI 将定期向中间进程询问数据,如果模型尚未更新数据,则会被告知等待。当数据从模型中可用时,如果用户选择这样做,我们还希望能够保留当前会话中的任何先前数据以导出到文件(即,我们希望 GUI 向接口导出(或加载)数据)。

除了遵守上述设计之外,我对后端/模型的修改权限很少。我有相当多的 c++ 经验,但没有太多的并行/异步应用程序经验。非常感谢任何帮助或指导。

0 投票
2 回答
110 浏览

.net - MemoryBarriers 和并行扩展

使用并行扩展时是否需要关注 MemoryBarriers?

编辑 - 详细说明原始问题是开放式的:(@xanatos 的答案是我正在寻找的答案)

举一个具体的例子:假设我使用 Parallel.ForEach 并且每次迭代都设置类中属性的值(每次迭代都设置它自己的特定属性,没有两次迭代设置相同属性的值)。在调用 Parallel.ForEach 的同一线程上,我访问从 Parallel.ForEach 设置的属性。

0 投票
2 回答
2266 浏览

java - 集合的 Java ConcurrentHashMap 模式

我在多线程应用程序中常用的数据结构是 ConcurrentHashMap,我想在其中保存一组共享相同键的项目。为特定键值安装第一项时会出现此问题。

我一直在使用的模式是:

是否有更好的模式来执行此操作?这甚至是线程安全的吗?Set有没有比内部更好的类java.util.HashSet

0 投票
1 回答
1249 浏览

java - 掌握java并发编程

我想掌握并发编程。
我听说 Doug Lea 有一些关于 Java 并发编程的好书

我应该先读哪本书?有没有其他书。如果有人能告诉我也指导我如何练习这个话题。

0 投票
1 回答
1682 浏览

java - Android/Java 线程休眠

除了隐式用户界面线程之外,我还创建了两个线程(可运行),它们内部都有一个 while 循环,我在其中定期检查我已实现的消息队列中的更新。

一开始的问题是,这两个while循环是无限的,而且它们变化如此之快,以至于它们几乎耗尽了设备的所有CPU。所以我考虑让while循环在每个循环后休眠大约100毫秒,让其他线程完成他们的工作,但我遇到了另一个问题:

现在,问题是线程休眠了 100 毫秒,但它们不会让 UI 线程在此期间工作 :( 这样做会使 UI 变得迟钝。当我在屏幕上拖动某些东西时,它会有点迟滞。

所以我想做的是让这些线程(这些while循环)每100毫秒检查一次消息队列标志,但是在这100毫秒内我想让UI线程运行。如何实现?

编辑 1

我找到了 yield 方法,它停止了当前线程的运行,但是我什么时候调用它呢?我需要调用睡眠线程,同时让它以某种方式产生......??

编辑 2

这两个类是单例,我从应用程序的第一个 Activity 启动它们,所以当应用程序启动时(UI 线程)

在每个里面run()我都有下一个代码:

0 投票
2 回答
332 浏览

erlang - 在使用 key-to-pid 机制时处理临时 gen_servers 状态的保存

我想知道当它们与密钥相关联时如何处理临时 gen_servers 状态的保存。

要将键与进程关联,我使用了一个名为 pidstore 的进程。Pidstore 最终启动进程。我给 pidstore 一个 Key 和一个 M,F,A,它在全局中查找密钥,然后如果找到则返回 pid 或应用 MFA(必须返回 {ok, Pid}),用密钥注册 Pid全局并返回 Pid。

我可能有许多不活动的 gen_servers,它们的状态可能很大。因此,我设置了 handle_info 回调以将状态保存在我的数据库中,然后停止该过程。gen_servers 在他们的主管中被认为是暂时的,所以它们不会重新启动,直到有东西再次需要它们。

问题从这里开始:如果我在代表 {car, 23} 的进程中的 handle_info 的保存步骤期间用它的键调用一个进程,比如 {car, 23},我会按预期取回 pid,因为过程正在保存且未完成。所以我会用 gen_server:call 调用我的进程,但我永远不会有响应(并达到默认的 5 秒超时),因为进程正在停止。(问题一)

为了解决这个问题,进程可以从全局注销自己,然后保存它的状态,然后停止。但是,如果我在注销后但在保存完成之前需要它,我将加载一个新进程,该进程可能会在数据库中加载未更新的值。(问题 B)

为了再次解决这个问题,我可以确保数据库中的加载和保存被排队并且不能并发。这可能是一个瓶颈。(问题 C)

我正在考虑另一种解决方案:我的进程在保存之前可以告诉 pidstore 他们很忙。pidstore 将保留一个繁忙进程的列表,并对这些键的任何需求做出“忙碌”响应。保存完成后,进程将告诉 pidstore no_more_busy 并在询问密钥时启动新进程。(即使旧的过程没有完成,它已经完成保存,所以它可以花时间独自死去)。

这对我来说似乎有点混乱,但是尝试多次从密钥中获取 Pid 感觉更简单,而不是包装对 gen_server 的每次调用以处理可能的超时。(当流程完成但仍在全球注册时)。

我对所有这些半问题和半解决方案有点困惑。您在这种情况下使用的设计是什么,或者我该如何避免这种情况?

我希望我的信息清晰易读,也请告诉我英文错误。

谢谢你

0 投票
1 回答
2057 浏览

concurrency - 使用细粒度锁的代码示例(JCR Jackrabbit?)

我正在进行一项学术研究,试图开发一种有助于实现细粒度锁定功能的编程工具,用于维护树状数据结构的并发程序。

例如,程序员可能会编写一些函数来接收树根节点并修改树(通过遍历某些路由并添加/删除节点),该工具将帮助他找到代码中的哪些节点应该被锁定和它们可以在哪里被释放——所以这些函数可以在同一棵树上同时执行。

我正在寻找一些现实生活中的代码示例,其中使用了这种细粒度的锁定,或者它可以用于更好的性能但程序员懒得实现它(例如,他在函数期间锁定了整个树-调用而不释放无用的节点)。

我阅读了使用树形数据库的 JCR 和 Jackrabbit,并找到了一篇解释如何在 JCR 中锁定节点的文章(但没有示例): http ://www.day.com/specs/jcr/2.0/17_Locking .html

我在数据库方面的背景非常小,我不完全理解在 Jackrabbit 数据库和并发方面什么是允许的,什么是不允许的。不允许从 2 个线程访问同一个节点,但是不同的存储库呢?如果 2 个不同的客户端尝试访问同一个节点会发生什么(例如,一个尝试删除它,另一个尝试修改它 - session.save() 会失败吗?)。

谢谢,奥伦

0 投票
1 回答
123 浏览

multitasking - 它是好标记还是不是 Ada95?

考虑 Ada95 中的以下控制器(受保护对象)以适应任务调用此控制器,如果等待标记 (Marker ) 仅在初始化之前自然地Waiting()对应于选择标记 (),则它不会被置于等待状态:Selecting_Marker