我正确地认为这是一个并行字典的正确使用 private ConcurrentDictionary<int,long> myDic = new ConcurrentDictionary<int,long>(); //Main thread at program startup for(int i = 0; i < 4; i++) { myDic.Add(i, 0); } //Seperate threads use this to update a value myDic[InputID] = newLongValue; 我没有锁等,只是更新字典中的值,即使多个线程可能会尝试做同样的事情。
我正在阅读关于Java中的volatile关键字,并完全理解它的理论部分。 但是,我正在寻找的是一个很好的例子,它显示了如果variables不是不稳定的,那么会发生什么。 下面的代码片段不能按预期工作( 来自aioobe ) class Test extends Thread { boolean keepRunning = true; public void run() { while (keepRunning) { } System.out.println("Thread terminated."); } public static void main(String[] args) throws InterruptedException { Test t = new Test(); t.start(); Thread.sleep(1000); t.keepRunning = false; System.out.println("keepRunning set to false."); } } 理想情况下,如果keepRunning不是易失性的,线程应该继续不断地运行。 但是,它几秒钟后停止。 我有两个基本的问题: 任何人都可以用例子解释volatile吗? 不符合JLS的理论。 挥发替代品是否同步? […]
如何清除ConcurrentBag ? 它没有任何方法像Clear或RemoveAll …
如果字典不包含给定键的值,还是会因为线程争用条件返回false而返回false,如另一个线程添加/更新的东西? 代码中的问题: ConcurrentDictionary<int, string> cd = new ConcurrentDictionary<int, string>(); // This might fail if another thread is adding with key value of 1. cd.TryAdd(1, "one"); // Will this ever fail if no other thread ever removes with the key value of 1? cd.TryRemove(1); 编辑:我认为它只会返回false,如果它不包含给定的键的值,但要绝对肯定。
我听说在Haskell中,创build一个multithreading应用程序就像使用一个标准的Haskell应用程序并使用-threaded标志编译它一样简单。 但是,其他情况下,在实际源代码中描述了使用par命令。 什么是Haskellmultithreading的状态? 引入程序有多简单? 是否有一个很好的multithreading教程,可以查看这些不同的命令及其用法?
我一直在阅读“真实世界Haskell”一书,关于并发性和并行性的一章。 我的问题如下: 由于Haskell线程真的只是一个“真正的”OS线程中的多个“虚拟”线程,这是否意味着创build很多(如1000)不会对性能产生严重影响? 也就是说,我们可以说用forkIO创build一个Haskell线程的开销(几乎)可以忽略不计? 如果可能,请带上切实的例子。 轻量级线程的概念不妨碍我们使用多核架构的好处吗? 据我所知,两个Haskell线程不可能同时在两个独立的内核上执行,因为从操作系统的angular度来看,它们确实是一个单一的线程。 还是Haskell运行时做了一些巧妙的技巧,以确保可以使用多个CPU?
实现一个可以在多个线程中修改的Hash的最佳方式是什么,但是锁的数量是最less的。 为了这个问题的目的,你可以假设哈希将是重读的。 它必须在所有Ruby实现中都是线程安全的,包括那些以真正同步的方式运行的实现,比如JRuby,它必须以纯Ruby(不允许C或Java)编写。 随意提交一个总是locking的天真的解决scheme,但这不可能是最好的解决scheme。 优雅的点,但较小的可能性locking胜过较小的代码。
作为来自于企业Web开发领域的HPC世界中的一员,我总是好奇地看到,“真实世界”中的开发者如何利用并行计算。 现在所有的芯片都是多核的 ,这更加重要,而且芯片上有成千上万个核心,而不是几个核心,就更加相关。 我的问题是: 这是如何影响你的软件路线图的? 我特别感兴趣的是关于多核如何影响不同软件领域的真实故事,所以请说明在您的答案中( 例如服务器端,客户端应用程序,科学计算等)您做了什么样的开发。 您现有的代码如何利用多核机器,以及您面临的挑战是什么? 你使用的是OpenMP , Erlang , Haskell , CUDA , TBB , UPC还是其他的东西? 随着并发水平的不断提高,你打算做什么?你将如何处理数百或数千个内核? 如果你的域不容易受益于并行计算,那么解释为什么它也是有趣的。 最后,我把它定义为一个多核问题,但可以随意谈论其他types的并行计算。 如果您正在移植部分应用程序以使用MapReduce ,或者如果大型群集上的MPI是您的范例,那么您也一定要提及这一点。 更新:如果你的答案是#5,提到你是否认为事情会改变,如果有更多的核心(100,1000等),你可以提供可用的内存带宽(看到带宽越来越小,每个核心)。 你仍然可以使用你的应用程序的其余核心?
我正在devise一个连接到一个或多个数据馈送stream的系统,并对数据进行一些分析,而不是基于结果触发事件。 在典型的multithreading生产者/消费者设置中,我将有多个生产者线程将数据放入一个队列,多个消费者线程读取数据,而消费者只对最新的数据点加上n个点感兴趣。 生产者线程将不得不阻止,如果缓慢的消费者无法跟上,当然消费者线程将阻止时,没有未经处理的更新。 使用读/写锁的典型并发队列可以很好地工作,但数据传入的速度可能很大,所以我想减less我的locking开销,尤其是制作者的locking锁。 我认为我需要一个循环的无锁缓冲区。 现在有两个问题: 循环锁无缓冲区的答案? 如果是这样,在我推出自己的之前,你知道任何符合我需要的公共实现吗? 任何实现循环无锁缓冲区的指针总是受欢迎的。 顺便说一句,在Linux上使用C ++来完成。 一些额外的信息: 响应时间对我的系统至关重要。 理想情况下,消费者线程将希望看到任何更新尽快进入,因为额外的1毫秒的延迟可能会使系统变得毫无价值,或价值更低。 我所倾向的devise思路是一个半无锁的循环缓冲区,其中生产者线程尽可能快地将数据放入缓冲区,让我们调用缓冲区A的头部,不阻塞,除非缓冲区满了, A满足缓冲区Z的结束。消费者线程将分别持有指向循环缓冲区P和P n的两个指针,其中P是线程的本地缓冲区头,P n是P之后的第n个项目。每个消费者线程将前进它的P和P n一旦完成处理当前的P,缓冲区指针Z的结束以最慢的P n前进。 当P赶上A,这意味着没有更多的新的更新处理,消费者旋转,并忙着等待A再次前进。 如果消费者线程旋转太久,它可以进入睡眠状态,并等待一个条件variables,但我可以消费者占用CPU周期等待更新,因为这不会增加我的延迟(我会有更多的CPU核心比线程)。 想象一下,你有一个循环轨道,生产者在一群消费者面前运行,关键是调整系统,使生产者通常跑在消费者的前面几步,这些操作大部分可以使用无锁技术完成。 我明白,要获得执行权的细节并不容易……好吧,非常辛苦,这就是为什么我想在从自己的angular度去学习别人的错误之前。
我最近一直在看Go的goroutine ,认为在Java中有类似的东西会很好。 就我所寻找的并行化方法调用的常见方式而言,就是做类似的事情: final String x = "somethingelse"; new Thread(new Runnable() { public void run() { x.matches("something"); } }).start(); 那不是很优雅。 有没有更好的方法来做到这一点? 我在一个项目中需要这样的解决scheme,所以我决定围绕asynchronous方法调用实现我自己的包装类。 我在J-Go上发布了我的包装类。 但是我不知道这是不是一个好的解决scheme。 用法很简单: SampleClass obj = … FutureResult<Integer> res = … Go go = new Go(obj); go.callLater(res, "intReturningMethod", 10); //10 is a Integer method parameter //… Do something else //… System.out.println("Result: "+res.get()); //Blocks […]