Questions tagged «concurrency»

并发是其中多个进程同时执行的系统的属性。

4
是什么阻止了锁上的竞争状况?
我了解什么是数据竞争,以及锁/互斥/信号灯如何防止它们的基础知识。但是,如果锁本身具有“竞赛条件”,会发生什么?例如,可能在同一应用程序中但在不同处理器上运行的两个不同线程尝试在完全相同的时间获取锁。 那会发生什么呢?为防止这种情况该怎么做?这是不可能的,还是完全不可能?还是等待发生的真实比赛条件?

8
确保函数永远不会两次返回相同的值[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 这是我在求职面试中被问到的一个问题,我无法弄清楚他们正在寻找的答案,所以我希望这里的人可能有一些想法。目的是编写一个保证永远不会两次返回相同值的函数。假设该功能将被多台机器同时访问。 我的想法是为每台机器分配一个唯一的ID,并将该值传递到唯一的值生成器函数中: var i = 0; function uniq(process_id, machine_id) { return (i += 1).toString() + machine_id + "-" + process_id; } 这将避免竞争条件带来的影响,因为即使两个或多个进程读取的相同值i,每个返回值都被标记为进程ID和计算机ID的唯一组合。但是,我的面试官不喜欢这个答案,因为使另一台计算机联机需要为其分配ID。 因此,有人能想到另一种解决此问题的方法,而不涉及将每台机器配置为具有唯一的ID吗?如果这个问题再次出现,我想得到一个答案。谢谢。

3
为什么通常首选多线程来提高性能?
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 6年前。 我有一个问题,那就是为什么程序员似乎总体上喜欢并发和多线程程序。 我在这里考虑2种主要方法: 一种基本上基于信号的异步方法,或者只是许多论文和语言(例如,新的C#5.0)所调用的一种异步方法,以及一个用于管理管道策略的“伴侣线程” 并发方法或多线程方法 我只是说,我正在考虑这里的硬件和最坏的情况,并且我自己已经测试了这两种范例,异步范例是赢家,因为我不明白为什么人们有90%的情况当他们想要加快工作速度或充分利用他们的资源时,谈论多线程。 我已经在一台旧计算机上使用Intel四核测试了多线程程序和异步程序,该英特尔四核在CPU内不提供内存控制器,内存完全由主板管理,在这种情况下,性能令人震惊。多线程应用程序,即使是数量相对较少的线程(例如3-4-5)也可能是一个问题,该应用程序没有响应,并且运行缓慢且令人不快。 另一方面,一种好的异步方法可能不会更快,但也并不坏,我的应用程序只是等待结果并且不会挂起,它具有响应能力,并且伸缩性更好。 我还发现,线程世界中的上下文更改在现实世界中并不是那么便宜,实际上它相当昂贵,尤其是当您有两个以上的线程需要循环和相互交换来计算时。 在现代CPU上,集成的内存控制器的情况并没有什么不同,但我的观点是x86 CPU基本上是一台串行计算机,并且该内存控制器的工作方式与在主板上带有外部内存控制器的旧计算机的工作方式相同。 。上下文切换仍然是我应用程序中的一个相关成本,并且集成了内存控制器或较新的CPU具有2个以上内核的事实对我来说并不便宜。 因为我所经历的并发方法在理论上是好的,但在实践中却不是那么好,由于硬件强加了内存模型,很难很好地利用这种范式,而且还引入了很多问题,从使用到使用我的数据结构连接到多个线程。 同样,这两种范式都不能提供任何安全性,而只是在某个时间点完成任务或工作时,从功能的角度来看,它们确实非常相似。 根据X86内存模型,为什么大多数人建议对C ++使用并发,而不仅仅是异步方法?另外,为什么不考虑环境切换可能比计算本身更昂贵的计算机的最坏情况呢?

2
具有两个python进程访问它的SQLite:一次阅读,一次写作
我正在开发一个包含两个组件的小型系统:一个从互联网资源中轮询数据,然后将其转换为sql数据以将其持久化在本地;第二个从本地实例读取该sql数据,并通过json和一个平稳的api提供服务。 我本来打算使用postgresql保留数据,但是由于应用程序将要存储的数据量非常小,无法提供服务,因此我认为这太过分了。SQLite是否可以胜任?我喜欢占用空间小的想法,并且不需要为此任务维护另一台sql服务器,但是我担心并发性。 似乎在启用预写日志记录的情况下,可以在不将任何进程锁定在数据库之外的情况下同时进行SQLite数据库的读写。 如果只有一个SQLite实例读取并且另一个写入,则单个SQLite实例能否维持两个并发进程对其进行访问?我开始编写代码,但想知道这是否是SQLite的错误应用。

5
函数式编程:关于并发和状态的正确想法?
FP支持者声称并发很容易,因为它们的范例避免了可变状态。我不明白 想象一下,我们正在使用FP创建一个多人地下城抓取(类似于Rogue),其中我们强调纯函数和不可变数据结构。我们生成一个由房间,走廊,英雄,怪物和战利品组成的地牢。我们的世界实际上是结构及其相互关系的对象图。随着事物的变化,我们对世界的表示也会进行修改以反映这些变化。我们的英雄杀死一只老鼠,捡起短剑,等等。 对我而言,世界(当前现实)带有这种状态观念,而我却缺少FP如何克服这种状况。当我们的英雄采取行动时,功能会改变世界状况。似乎每个决定(人工智能或人为决定)都需要基于当前的现状。我们在哪里允许并发?我们不能同时有多个进程来修改世界状态,以免一个进程的结果基于某个过期状态。在我看来,所有控制都应在单个控制循环中进行,以便我们始终在处理由当前当前对象图表示的当前状态。 显然,有些情况非常适合并发(例如,在处理状态彼此独立的孤立任务时)。 我没有看到并发在我的示例中如何有用,这可能是问题所在。我可能以某种方式歪曲了这一主张。 有人可以更好地代表这一主张吗?

2
ES / CQRS并发处理
我最近开始研究CQRS / ES,因为我可能需要在工作中应用它。对于我们来说,这似乎很有希望,因为它将解决很多问题。 我对ES / CQRS应用程序如何看起来像上下文简化后的银行业务用例(提取资金)进行了粗略的了解。 综上所述,如果A人提取了一些钱: 发出命令 命令已交出以进行验证/验证 如果验证成功,则将事件推送到事件存储 聚合器使事件出队以对聚合应用修改 据我了解,事件日志是事实的源泉,因为它是FACTS的日志,因此我们可以从中得出任何预测。 现在,在这种宏伟的计划中,我不了解的是在这种情况下会发生什么: 规则:余额不能为负 A人的余额为100e 人A发出100e的WithdrawCommand 验证通过并发出100e事件的MoneyWithdrewEvent 同时,人A发出另一个100e的WithdrawCommand 第一个MoneyWithdrewEvent尚未汇总,因此验证通过,因为针对汇总(尚未更新)的验证检查 再次发出100e的MoneyWithdrewEvent ==>我们处于不一致状态,余额为-100e,并且日志包含2 MoneyWithdrewEvent 据我了解,有几种策略可以解决此问题: a)将聚合版本ID和事件一起放入事件存储中,因此,如果修改后版本不匹配,则不会发生任何事情 b)使用一些锁定策略,这意味着验证层必须以某种方式创建一个 与策略有关的问题: a)在这种情况下,事件日志不再是事实的源头,如何处理?另外,我们还给客户端确定,但是允许退出是完全错误的,在这种情况下使用锁是否更好? b)锁==死锁,您对最佳做法有什么见解? 总体而言,我对如何处理并发的理解正确吗? 注意:我了解同一个人不可能在如此短的时间内提取两次资金,但是我举了一个简单的例子,不要迷失细节

4
为什么协程又回来了?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 协程的大部分基础工作都发生在60年代/​​ 70年代,然后停下来,取而代之的是其他选择(例如线程) 对以Python和其他语言出现的协程产生新兴趣的实质是什么?


2
为什么共享状态会降低性能?
我一直在并发编程的“不分担”原则下工作。本质上,我的所有工作线程都具有相同状态的不可变只读副本,它们之间从未共享(即使通过引用)。总体而言,这确实很好。 现在,有人引入了一个无锁单例缓存(例如静态字典),所有线程正在同时访问。由于字典在启动后永远不会更改,因此没有锁。没有任何线程安全问题,但是现在性能下降了。 问题是...由于没有锁,为什么引入此单例会导致性能下降?幕后到底发生了什么,可以解释这一点? 确认一下,唯一的改变就是访问这个新的单例,我只需注释掉对缓存的调用就可以可靠地重新创建它。

6
在电子商务网站中将并发管理到篮子的最佳实践
管理两个客户同时添加库存仅为1个产品的情况的最佳实践是什么? 必须在购物篮的代码中进行检查,以避免这2个客户之一添加相同的产品? 还是必须在付款阶段执行此检查,例如进行第二次查询以确认相关产品仍在库存中(即并发客户尚未购买的产品)?

3
为什么要有五个餐饮哲学家?
我想知道为什么餐饮哲学家问题是基于五个哲学家的案例。为什么不四个? 我猜想我们在讨论五位哲学家的例子时也可以观察到所有令人不快的问题,当我们得到四位思想家时,也会发生。那仅仅是出于历史原因吗?

5
DelayQueue在现实世界中的使用
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 DelayQueue在现实世界中的用途是什么,它旨在解决哪些常见问题?

3
您对演员模型有何看法?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 Erlang使用的Actor模型似乎是进行并发编程的非常不同的方式。您对演员模型有何看法?它将是流行的并发解决方案吗?

4
声称自己不“多核”友好的程序
您会时不时看到这个短语或类似词,通常指的是声称它们并非旨在充分利用多核处理器的程序。这在视频游戏编程中尤其常见。(当然,许多程序没有并发并且不需要它,例如基本脚本等)。 怎么会这样?许多程序(尤其是游戏)固有地使用并发性,并且由于OS负责CPU上的任务调度,那么这些程序是否固有地没有利用可用的多个内核?在这种情况下,“利用多核”意味着什么?这些开发人员实际上是在禁止OS任务调度并强制进行亲和力还是自己进行调度?(听起来像是主要的稳定性问题)。 我是Java程序员,所以也许由于抽象或其他原因我不必处理这个问题。

4
非功能语言中持久数据结构的使用
纯粹的功能或近乎纯功能的语言会从持久性数据结构中受益,因为它们是不可变的,并且非常适合无状态编程功能。 但是,我们不时看到用于Java等(基于状态的OOP)语言的持久数据结构库。人们经常听到有人主张使用持久性数据结构,因为它们是不可变的,因此是线程安全的。 但是,持久性数据结构是线程安全的,原因是,如果一个线程将一个元素“添加”到持久性集合中,则该操作将返回一个新集合,就像原始集合一样,但是添加了元素。因此,其他线程将看到原始集合。当然,这两个集合共享许多内部状态-这就是为什么这些持久性结构有效的原因。 但是,由于不同的线程看到的数据不同的状态,它似乎是持久数据结构是不是本身足以处理的情况,其中一个线程进行更改,对于其它线程是可见的。为此,似乎我们必须使用诸如原子,引用,软件事务性存储器乃至经典锁和同步机制之类的设备。 那么为什么PDS的不变性被吹捧为有利于“线程安全”的东西呢?在PDS协助同步或解决并发问题方面,有没有真实的例子?还是PDS只是一种为对象提供无状态接口以支持功能编程风格的方式?

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.