线程通信背后的共同理论是什么?我对它应该如何工作有一些原始的想法,但有些事情我不太满意。有没有办法用中断来解决这个问题呢?
发布于 2009-02-17 02:08:36
实际上,这与任何并发问题都是一样的:您有多个控制线程,并且不确定何时在哪些线程上执行哪些语句。这意味着在整个程序中有大量潜在的执行路径,并且您的程序必须在所有这些路径下都是正确的。
通常,在线程之间共享状态(在过去称为“轻量级进程”)时,可能会出现问题。当存在共享内存区域时会发生这种情况,
为了确保正确性,您需要做的是确保这些数据区域以不会导致错误的方式进行更新。要做到这一点,您需要确定程序的“关键部分”,其中必须保证顺序操作。它们可以像一条指令或一行代码一样小;如果语言和体系结构确保它们是原子的,即不能被中断,那么您就是黄金。
否则,你要识别该部分,并在其上设置某种形式的守卫。经典的方法是使用信号量,这是一种原子语句,一次只允许一个控制线程通过。它们是由Edsgar Dijkstra发明的,因此有来自荷兰语的名称,P和V。当你到达P时,只有一个线程可以继续;所有其他线程都排队等待,直到执行的线程进入相关的V操作。
因为这些原语有点原始,而且荷兰语的名字不是很直观,所以已经开发了一些其他更大规模的方法。
Per Brinch-Hansen发明了监视器,它基本上只是一个数据结构,它具有保证原子的操作;它们可以用信号量实现。监视器在很大程度上是Java synchronized语句的基础;它们使用更简单的语法使对象或代码块具有特定的行为--即,一次只能有一个线程“处于”它们之中。
还有其他更好的办法。Haskell和Erlang解决了这个问题,因为它们是函数式语言,永远不允许变量在创建后被修改;这意味着他们自然不需要担心同步。一些新的语言,如Clojure,有一种称为“事务性内存”的结构,这基本上意味着当有一个赋值时,可以保证这个赋值是原子的和可逆的。
简而言之,这就是它。要真正了解它,最好的地方是查看操作系统文本,例如,Andy Tannenbaum's text。
发布于 2009-02-17 02:23:44
两种最常见的线程通信机制是共享状态和message passing。
发布于 2009-02-17 02:11:39
THe线程最常见的通信方式是通过一些共享数据结构,通常是一个队列。一些线程将信息放入队列,而另一些线程则将其取出。队列必须受到操作系统设施的保护,例如互斥和信号量。中断与此无关。
https://stackoverflow.com/questions/555292
复制相似问题