16.5 消息并发传递

来源:互联网 发布:linux less和more 编辑:程序博客网 时间:2024/05/19 20:48
 

16.5 消息并发传递

 

    当我们在第 14 章中讨论开发并发程序时,关注的技术是避免使用可变状态。没有可变状态,就可以并行地运行一个计算的几个部分,因为它们不会彼此干扰。这在许多能够以函数方式实现的数据处理问题时,工作地非常好,但在处理需要更频繁地交换信息时,也有问题。

    最广为人知的解决方案是,使用共享内存(shared memory)和通过锁定保护访问共享的状态。用这种技术的问题在于,正确使用锁定是相当困难的。必须确保所有的共享内存都是正确锁定(以避免争用条件(race conditions),当多个线程写入相同的位置时)。另一个困难是,当获得锁时,不小心就可能引起死锁(deadlock),两个线程永远被阻塞,每个进程都等待对方完成。

    在 F# 中,MailboxProcessor<'Msg> 类型可用于实现并行编程,使用一种被称为消息传递并发性(message passing concurrency)的技术。这种方法并未广泛应用,但在一种函数式语言 Erlang [Armstrong et al., 1996] 中,是并发性的基础,以其可扩展性而闻名。当我们在绘制矩形的应用程序中,把状态保存到邮箱时,已经看到过这种方法,但那种情况是为了探索异步逻辑和事件处理而设计的,并不是真实的并发性。

    在这一节中,我们将看使用多个线程中的邮箱处理器,来演示这种做法。我们将使用的示例,有一个邮箱处理器和多个访问它的异步工作流(运行在多个线程上)。使用消息传递并发性更复杂的程序,经常使用多个彼此通信的邮箱处理器。

原创粉丝点击