Questions tagged «concurrency»

在计算机科学中,并发是系统的属性,其中可以在重叠的时间段内执行多个计算。这些计算可以在同一芯片的多个内核上执行,也可以在同一处理器上抢占时间共享线程,或者在物理上分开的处理器上执行。

4
从goroutine捕获返回值
以下代码给出了编译错误,提示“意外运行”: x := go doSomething(arg) func doSomething(arg int) int{ ... return my_int_value } 我知道,如果正常调用函数就可以获取返回值,而无需使用goroutine。或者我可以使用频道等 我的问题是为什么不能从goroutine中获取像这样的返回值。

3
了解std :: hardware_destructive_interference_size和std :: hardware_constructive_interference_size
添加了C ++ 17std::hardware_destructive_interference_size和std::hardware_constructive_interference_size。首先,我认为这只是获得L1缓存行大小的一种可移植的方法,但这过于简单了。 问题: 这些常量与L1缓存行大小有何关系? 有没有一个很好的例子来说明他们的用例? 两者都被定义static constexpr。如果生成二进制文件并在具有不同缓存行大小的其他计算机上执行二进制文件,这不是问题吗?当您不确定代码将在哪台计算机上运行时,如何在这种情况下防止错误共享?

3
ConcurrentDictionary TryRemove何时返回false
它会仅在字典中不包含给定键的值的情况下才返回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,但要绝对确定。
79 c#  .net  concurrency 

7
在node.js中协调并行执行
node.js的事件驱动编程模型使协调程序流变得有些棘手。 简单的顺序执行变成嵌套的回调,这很容易(尽管有些麻烦以至于要写下来)。 但是并行执行呢?假设您有三个可以并行运行的任务A,B,C,当它们完成后,您要将其结果发送给任务D。 对于前叉/连接模型,这将是 叉子A B叉 C叉 加入A,B,C,运行D 我该如何在node.js中编写它?是否有最佳做法或食谱?我是否必须每次都手动解决方案,还是有一些带有帮助程序的库?

10
我应何时在ExecutorService上使用CompletionService?
我刚刚在此博客文章中找到了CompletionService 。但是,这并没有真正展示CompletionService相对于标准ExecutorService的优势。可以使用任一代码编写相同的代码。那么,什么时候CompletionService有用? 您能否提供简短的代码示例以使其清晰可见?例如,此代码示例仅显示不需要CompletionService的位置(=等同于ExecutorService) ExecutorService taskExecutor = Executors.newCachedThreadPool(); // CompletionService<Long> taskCompletionService = // new ExecutorCompletionService<Long>(taskExecutor); Callable<Long> callable = new Callable<Long>() { @Override public Long call() throws Exception { return 1L; } }; Future<Long> future = // taskCompletionService.submit(callable); taskExecutor.submit(callable); while (!future.isDone()) { // Do some work... System.out.println("Working on something..."); } try { …

6
演员模型:为什么Erlang / OTP特别?你能用另一种语言吗?
我一直在研究Erlang / OTP,因此,一直在阅读(好的,略读一下)演员模型。 据我了解,参与者模型只是一组功能(在Erlang / OTP中称为“进程”的轻量级线程中运行),它们仅通过消息传递相互通信。 用C ++或任何其他语言实现这似乎微不足道: class BaseActor { std::queue<BaseMessage*> messages; CriticalSection messagecs; BaseMessage* Pop(); public: void Push(BaseMessage* message) { auto scopedlock = messagecs.AquireScopedLock(); messagecs.push(message); } virtual void ActorFn() = 0; virtual ~BaseActor() {} = 0; } 每个进程都是派生BaseActor的实例。Actor仅通过消息传递相互通信。(即推动)。参与者在初始化时向中心地图注册自己,该地图允许其他参与者找到他们,并允许中心功能贯穿他们。 现在,我知道我在这里遗漏了,或者更确切地说,是在掩盖一个重要问题,即:缺乏屈服意味着单个Actor可能不公平地消耗过多时间。但是跨平台协程是C ++中使这一点变得困难的主要因素吗?(例如,Windows具有纤维。) 我还有什么想念的吗,或者模型真的很明显吗?

3
在sun.misc.Unsafe.park(本机方法)中等待
我的一个应用程序在负载下运行了一段时间后挂起,有人知道是什么会导致jstack中的此类输出: "scheduler-5" prio=10 tid=0x00007f49481d0000 nid=0x2061 waiting on condition [0x00007f494e8d0000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000006ee117310> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1085) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1043) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1103) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722) 我在挂起的jstack输出中看到了很多。 我大量使用Spring @Async和地图,同步地图和ehcache。 有趣的是,这仅发生在一个应用实例上。另外两个运行得很好。在这种情况下,我还能进行哪些调查以获取更多详细信息? 我发现了这个帖子/programming/23992787/parking-to-wait-for-0xd8cf0070-a-java-util-concurrent-locks-abstractqueueds,但是在我的情况下它不是很有用。

5
Java并发:CAS与锁定[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 改善这个问题 我正在阅读《实践Java并发》一书。在第15章中,他们讨论了非阻塞算法和比较交换(CAS)方法。 据记载,CAS的性能比锁定方法好得多。我想问一下已经使用这两个概念的人,并想听听您更喜欢这些概念中的哪一个?真的那么快吗? 对我来说,锁的用法更加清晰,易于理解,甚至维护起来也更好(如果我错了,请更正我)。我们是否应该真正专注于创建与CAS相关的并发代码,而不是锁定,以获得更好的性能提升,或者可持续性更重要? 我知道何时使用什么可能没有严格的规定。但是我只是想听听一些有关CAS新概念的意见和经验。

2
如何使用python的asyncio模块正确创建和运行并发任务?
我正在尝试Task使用Python 3的相对较新的asyncio模块正确理解和实现两个同时运行的对象。 简而言之,asyncio似乎旨在处理Task事件循环中的异步过程和并发执行。它促进了await(应用于异步函数中)作为无回调方式等待和使用结果的使用,而不会阻塞事件循环。(期货和回调仍然是可行的选择。) 它还提供了asyncio.Task()该类,该类是Future 设计用于包装协程的专门子类。最好通过使用该asyncio.ensure_future()方法来调用。异步任务的预期用途是允许独立运行的任务与同一事件循环中的其他任务“同时”运行。我的理解是Tasks连接到事件循环,然后该循环自动继续驱动await语句之间的协程。 我喜欢无需使用任何一个Executor类就可以使用并发Task的想法,但是在实现方面我没有发现太多细节。 这是我目前正在做的事情: import asyncio print('running async test') async def say_boo(): i = 0 while True: await asyncio.sleep(0) print('...boo {0}'.format(i)) i += 1 async def say_baa(): i = 0 while True: await asyncio.sleep(0) print('...baa {0}'.format(i)) i += 1 # wrap in Task object # -> automatically …

12
Java中volatile关键字的最简单易懂的示例
我正在阅读有关Java中的volatile关键字的信息,并完全理解了它的理论部分。 但是,我要寻找的是一个很好的案例,它显示了如果变量不是volatile的话会发生什么。 以下代码段未按预期运行(从此处获取): 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的理论。 …

13
有很好的Actors for C#实现吗?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow的主题。 5年前关闭。 改善这个问题 .net / c#是否有任何好的Actor并发模型实现? 我必须优化ac#例程,并且我认为参与者模型非常适合作为我的问题的解决方案。不幸的是,我只有scala实现方面的经验。
75 c#  .net  concurrency  actor 

9
从List <Future>到Future <List>序列
我正在尝试转换List&lt;CompletableFuture&lt;X&gt;&gt;为CompletableFuture&lt;List&lt;T&gt;&gt;。当您有许多异步任务并且需要获得所有异步任务的结果时,这非常有用。 如果它们中的任何一个失败,那么最终的未来将失败。这就是我实现的方式: public static &lt;T&gt; CompletableFuture&lt;List&lt;T&gt;&gt; sequence2(List&lt;CompletableFuture&lt;T&gt;&gt; com, ExecutorService exec) { if(com.isEmpty()){ throw new IllegalArgumentException(); } Stream&lt;? extends CompletableFuture&lt;T&gt;&gt; stream = com.stream(); CompletableFuture&lt;List&lt;T&gt;&gt; init = CompletableFuture.completedFuture(new ArrayList&lt;T&gt;()); return stream.reduce(init, (ls, fut) -&gt; ls.thenComposeAsync(x -&gt; fut.thenApplyAsync(y -&gt; { x.add(y); return x; },exec),exec), (a, b) -&gt; a.thenCombineAsync(b,(ls1,ls2)-&gt; { ls1.addAll(ls2); return ls1; },exec)); …

18
圆形无锁缓冲器
我正在设计一个系统,该系统连接到一个或多个数据提要流,并根据触发结果对数据进行一些分析。在典型的多线程生产者/消费者设置中,我将有多个生产者线程将数据放入队列中,并且有多个消费者线程读取数据,并且消费者只对最新数据点加n个点感兴趣。如果慢速使用者无法跟上生产者线程,则生产者线程将不得不阻塞,当然,当没有未处理的更新时,使用者线程也会阻塞。使用具有读取器/写入器锁定的典型并发队列会很好地工作,但是数据输入的速率可能很大,因此我想减少我的锁定开销,特别是为生产者减少写入器锁定。我认为我需要一个循环无锁缓冲区。 现在有两个问题: 循环无锁缓冲区是否是答案? 如果是这样,在我提出自己的建议之前,您知道任何适合我需要的公共实施方式吗? 始终欢迎实现循环无锁缓冲区的任何指针。 顺便说一句,在Linux上的C ++中执行此操作。 一些其他信息: 响应时间对我的系统至关重要。理想情况下,使用者线程希望尽快看到任何更新,因为额外的1毫秒延迟可能会使系统一文不值,甚至少很多。 我倾向于的设计思想是一个无半锁的循环缓冲区,在此缓冲区中,生产者线程将数据尽可能快地放入缓冲区中,我们将其称为缓冲区A的头,除非缓冲区已满,否则不要阻塞A与缓冲区Z的末尾相遇。使用者线程将分别持有两个指向循环缓冲区的指针P和P n,其中P是线程的本地缓冲区头,而P n是P之后的第n个项目。每个使用者线程都将推进其P一旦完成当前P的处理,P n和P n就会以最慢的P n前进到缓冲区指针Z的末尾。当P赶上A,这意味着不再有新的更新要处理时,使用者旋转并忙于等待A再次前进。如果使用者线程旋转时间过长,则可以使其进入睡眠状态并等待条件变量,但是我可以接受使用者占用CPU周期等待更新,因为这不会增加我的延迟(我将拥有更多的CPU内核)比线程)。想象一下,您有一个循环的轨道,而生产者在一群消费者的面前运行,关键是调整系统,以便生产者通常比消费者领先几步,而其中大多数操作可以使用无锁技术完成。我知道正确实现实现的细节并不容易...好吧,非常艰苦,这就是为什么我想在别人做些自己的事情之前先从别人的错误中学习。


6
仅在尚未插入的行插入
我一直使用类似于以下内容的方法来实现它: INSERT INTO TheTable SELECT @primaryKey, @value1, @value2 WHERE NOT EXISTS (SELECT NULL FROM TheTable WHERE PrimaryKey = @primaryKey) ...但是一旦加载,就会发生主键冲突。这是唯一插入到该表中的唯一语句。那么这是否意味着上述陈述不是原子的? 问题在于,几乎不可能随意重建。 也许我可以将其更改为以下内容: INSERT INTO TheTable WITH (HOLDLOCK, UPDLOCK, ROWLOCK) SELECT @primaryKey, @value1, @value2 WHERE NOT EXISTS (SELECT NULL FROM TheTable WITH (HOLDLOCK, UPDLOCK, ROWLOCK) WHERE PrimaryKey = @primaryKey) 虽然,也许我使用了错误的锁或使用了过多的锁之类的东西。 我在stackoverflow.com上看到了其他问题,那里的答案都提示“ …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.