-edit-我想要一个大型列表,所以我可以参考这个想法。一些答案已经启发了
什么是并发模型?我听说过没有共享内存的消息传递。期货会立即返回一个对象(因此它不会阻塞)并允许您在以后需要阻止时取消引用原始函数返回值,如果结果尚未准备就绪。我听说过coroutines,软件事务内存和随机的其他内容。
我搜索了一个列表或wiki并且找不到任何好的(很多没有列出我上面提到的3)并且许多结果给了我一个复杂的描述,解释它是如何工作的,而不是它的作用或如何成为使用
什么是并发模型以及它们的作用的简单描述是什么?每个答案一个。
答案 0 :(得分:8)
我听说过没有共享内存的消息传递。
是关于Erlang风格的演员吗?
Scala在其Actors框架中使用了这个想法(因此,在Scala中它不是语言的一部分,只是一个库),它看起来很性感!
简而言之,Actors是根本没有共享数据的对象,但可以使用异步消息进行交互。 Actor可以位于一个或不同的主机上,并使用有趣的错误处理策略(当错误发生时 - actor就会死掉)。
您应该在Erlang和Scala文档中阅读更多内容,这是非常简单和渐进的方法!
第3章,第17章,第17章:
http://www.scala-lang.org/sites/default/files/linuxsoft_archives/docu/files/ScalaByExample.pdf https://en.wikipedia.org/wiki/Actor_model
答案 1 :(得分:6)
COM对象可以在进程的多个线程中使用。条款 “单线程公寓* t”(STA)和 “ *多线程公寓”(MTA)是 用于创建概念框架 用于描述这种关系 在对象和线程之间, 并发关系 对象,方法的手段 调用被传递给一个对象,和 传递接口的规则 线程之间的指针。组件和 他们的客户选择 以下两个公寓型号 目前由COM支持:
单线程公寓模型(STA): 进程中的一个或多个线程使用 COM和调用COM对象是 由COM同步。接口是 在线程之间编组。一个 退化的单线程案例 公寓模型,这里只有一个线程 在给定的进程中使用COM,被调用 单线程模型。以前 微软信息和 文档有时会提到 简单地将STA模型作为 “公寓模特。”多线程 公寓模型(MTA):一个或多个 线程使用COM并调用COM 与MTA关联的对象是 由所有线程直接制作 与MTA相关联而没有任何 在...之间插入系统代码 来电者和对象。因为多个 同时客户可能正在呼叫 对象或多或少同时 (同时在多处理器上 系统),对象必须同步 他们自己的内部状态。 接口之间没有编组 线程。以前的微软 信息和文件有 有时将此模型称为 “自由线程模型”。这俩 STA模型和MTA模型都可以 在同一过程中使用。这是 有时也被称为a “混合模式”过程。
有几种并发模式 计算,可以用来 理解和分析并发 系统。这些模型包括:
答案 2 :(得分:4)
未来是一个持有者 未确定的结果(并发) 计算。一旦计算完毕 提供结果,相关联 全球消除了未来 用结果值替换它。 这个价值可能是一个独立的未来。
每当一个人要求未来时 并发计算,即它尝试 访问它的值,那个计算 自动同步 通过阻止直到它成为未来 确定或失败。
有四种期货:
- 并发期货代表并发计算的结果,
- 懒惰的期货代表只在请求时执行的计算结果,
- 承诺期货代表承诺将通过明确方式交付的价值,
- 失败的期货代表以异常终止的计算结果。
答案 3 :(得分:4)
还有map / reduce。
这个想法是产生子问题的许多实例,并在完成后将答案组合起来。一个简单的例子是矩阵乘法,它是几个点积的总和。您为每个点积生成一个工作线程,当所有线程都完成后,您将对结果求和。
这就是GPU,LISP / Scheme / APL等功能语言和一些框架(Google的Map / Reduce)处理并发的方式。
答案 4 :(得分:3)
在计算机科学,软件方面 事务性内存(STM)是一种 并发控制机制 类似于数据库事务 控制对共享内存的访问 并发计算。它是一个 替代基于锁的 同步。这是一个交易 context是一段代码 执行一系列读写操作 共享内存。这些读取和 写入逻辑上发生在一个单一的 及时;中间状态 对其他人不可见(成功) 交易。提供的想法 硬件支持交易 起源于1986年的论文和专利 汤姆奈特[1]。这个想法是 由Maurice Herlihy和J.推广 艾略特·B·莫斯[2]。 1995年Nir Shavit 和Dan Touitou将这个想法扩展到了 纯软件事务内存 (STM)[3]。 STM最近一直是 专注于研究和支持 实际的实现是 越来越大。
答案 5 :(得分:2)
在计算机科学中,协同程序是 概括的程序组件 子程序允许多次输入 暂停和恢复的要点 在某些地点执行。 协同程序非常适合 实施更熟悉的计划 合作任务等组件, 迭代器,无限列表和管道。
答案 6 :(得分:1)
还有非阻塞并发,例如比较和交换以及加载链接/存储条件指令。例如,compare-and-swap(cas)可以这样定义:
bool cas(int new_value,int current_value,int * location);
然后,此操作将尝试将location的值设置为new_value中传递的值,但前提是该位置中的值与current_value相同。这只需要一条指令,通常是如何实现阻塞并发(互斥/信号量等)。
答案 7 :(得分:1)
您好,
在维基页面中,您可以发现MPI(消息传递接口)是一种通用IPC技术的方法:http://en.wikipedia.org/wiki/Inter-process_communication
另一个有趣的方法是远程过程调用。例如,Java的RMI可以帮助您
只关注您的应用程序域和通信模式。这是一个“应用程序级”并发
http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136424.html
有各种设计模式/工具可用于辅助共享内存模型并行化。除了上述期货,人们还可以利用:
1.线程池模式 - 侧重于固定线程数之间的任务分配:http://en.wikipedia.org/wiki/Thread_pool_pattern
2.调度程序模式 - 根据选定的调度策略http://en.wikipedia.org/wiki/Scheduler_pattern控制线程执行
3.反应器模式 - 在并行环境http://en.wikipedia.org/wiki/Reactor_pattern中嵌入单线程应用程序
4. OpenMP(允许通过预处理程序编译指示并行化部分代码)
的问候,
马尔钦
答案 8 :(得分:1)
答案 9 :(得分:1)
tuple space怎么样?
元组空间是关联存储器范例的实现 用于并行/分布式计算。它提供了元组的存储库 可以同时访问。作为说明性示例, 考虑到有一组处理器可以生产 数据和一组使用该数据的处理器。制片人张贴他们的 数据作为空间中的元组,然后消费者从中检索数据 与特定图案匹配的空间。这也被称为 黑板上的隐喻。元组空间可以被认为是一种形式 分布式共享内存。
答案 10 :(得分:1)
LMAX的破坏程序模式保持数据到位,并确保一次只有一个线程(使用者或生产者)是数据项(=队列槽)的所有者。