我所做的大部分多线程工作都是使用C / C ++,Python或Delphi(Object Pascal)。全部在Windows上。我将在这里使用Delphi进行讨论。 Delphi有一个很好的类叫做TThread,它抽象了线程创建过程。该类提供了一个Execute方法,它是创建的线程的线程函数。您重写该方法,并通常在其中创建一个循环,当线程终止时退出。你在循环中完成线程的工作。
其中一个重复出现的任务是跟踪(仔细)在线程的上下文中执行哪些代码以及哪些代码由外部上下文中的外部线程执行,同步对象保护线程共享的数据。所有基本线程编程的东西。其中一个反复出现的烦恼是创建函数以允许外部线程提交或检索数据,并将数据从公共线程安全内存对象移动到线程专用的数据,然后以相反的方式返回。
我想知道是否有人见过编程语言让这更简单?这就是我喜欢的编程线程习语。让我们为本次讨论创建一个Delphi TThread子类。假设我可以使用Private,PublicExecuteInAnyContext或PublicExecuteInPrivateContext这三个关键字之一标记类方法。这是他们的工作方式。
私有:私有方法只会在线程的上下文中执行。如果代码路径导致该方法在主机线程之外的上下文中执行,编译器将自动添加会引发异常的代码。 (例如 - “错误,尝试执行私有方法从线程$ EE0线程$ AEB”)。
PublicExecuteInAnyContext:标记为此类的方法可以由拥有该方法的线程和任何外部线程调用。这些方法中引用的任何数据对象都将自动使用同步对象进行保护,并可选择覆盖默认选项并提供自己的选择。 (互斥或信号量代替临界区等)
PublicExecuteInPrivateContext:使用此关键字标记的方法将在线程的上下文中执行,但可由任何线程调用。这个选项允许两种策略来处理外部线程对这些方法的调用:
1)模式1 - 块调用线程:调用线程将阻塞,直到返回该方法。换句话说,编译器会自动编写代码以使调用线程阻塞。调用线程传递的任何参数都将被复制到主机线程专用的变量中。在主机线程接收到控制之前,该方法不会执行。当主机线程退出该方法时,调用线程将被释放,并且该方法返回的任何结果都会复制到它自己的私有变量空间中。
2)模式2 - 不要阻塞调用线程:这将允许回调函数的附加参数。由外部线程传递给方法的任何参数都将被复制到线程的私有变量空间中。编译器将再次保持方法的执行,直到主机线程接收到控制,但是会让调用线程继续而不会阻塞。当主机线程完成方法的执行时,如果指定了回调函数,它将调用该函数**但是在调用该方法的原始线程的上下文中,而不是在主机线程上下文中。
一种能够提供这种自动线程处理的语言,至少对我来说,做多线程会比现在我必须这样做更有趣。有没有人见过一种编程语言,或者是一种主流语言的模块/ hack,它提供了这种多线程模型?
答案 0 :(得分:3)
我不认为它与您的描述完全匹配,但Erlang提供了我见过的最简单的并发模型之一。它采用无共享方式,可能听起来也可能不吸引你,但我发现它真的很有趣。如果您有需要,使用它创建分布式系统也非常容易。查看"Getting Started with Erlang",这是一个很棒的教程,几乎涵盖了该语言的所有部分。
答案 1 :(得分:0)
想提一下。 LabVIEW真正使多线程开始变得轻而易举。我刚刚在互联网上发现了一些文章,它实际上以更好的方式解释了这一点:
如果你已经编程了 传统的文本语言之前, Labview的数据流范例可以 有点难以拥抱。该 数据流范例规定了它 在2D上无所谓 框图表面a 特定组件放在 与其他组件的关系,但是什么 它连接的其他组件。一个 特定组件节点没有 执行直到所有输入都是 可用的;然而,它执行 一旦所有输入都可用, 不管其他什么可能 在同一时间执行,即 - 可能与许多人并行 其他的事情。
您需要丰富的经验 多线程编程 然而,传统语言 真正体会到它是多么的轻松 使用LabVIEW实现多线程 并行性如何自然 出现 - 无论是故意的,还是 不。虽然LabVIEW并不神奇 解决与之相关的所有挑战 并行处理,当然 让它变得相当简单 从它开始。事实上,相反 与传统的顺序 文本编程语言,它是 来自的顺序执行 LabVIEW中的价格 - 并行性 几乎是免费的。