multithreading - 有没有人见过像这样处理线程的编程语言?

标签 multithreading posix

我所做的大部分多线程工作都是在 C/C++、Python 或 Delphi(Object Pascal)中完成的。全部在 Windows 上。我将在这里使用 Delphi 进行讨论。 Delphi 有一个名为 TThread 的好类,它抽象了线程创建过程。该类提供了一个 Execute 方法,它是创建线程的线程函数。您覆盖该方法并通常在其中创建一个循环,该循环在线程终止时退出。您在循环内完成线程的工作。

出现的重复任务之一是(仔细)跟踪哪些代码在线程的上下文中执行,哪些代码由外部线程在外部上下文中执行,同步对象保护线程共享的数据。所有基本的线程编程东西。经常出现的烦恼之一是创建函数以允许外部线程提交或检索数据,并将数据从公共(public)线程安全内存对象移动到线程私有(private)的内存对象,然后以另一种方式返回。

我想知道是否有人见过使这变得更简单的编程语言?这是我喜欢的编程线程习语。让我们为这个讨论创建一个 Delphi TThread 子类。假设我可以使用 Private、PublicExecuteInAnyContext 或 PublicExecuteInPrivateContext 等三个关键字之一来标记类方法。以下是他们的工作方式。

Private:私有(private)方法只会在线程的上下文中执行。如果代码路径导致该方法在宿主线程之外的上下文中执行,编译器将自动添加会引发异常的代码。 (例如 - “错误,尝试从线程 $EE0 执行线程 $AEB 的私有(private)方法”)。

PublicExecuteInAnyContext:标记为此类的方法可以由拥有该方法的线程和任何外部线程调用。这些方法中引用的任何数据对象都将自动使用同步对象进行保护,并且可以选择覆盖默认选择并提供您自己的选择。 (互斥量或信号量代替临界区等)

PublicExecuteInPrivateContext:用这个关键字标记的方法将在线程的上下文中执行,但可以被任何线程调用。此选项将允许两种策略来处理外部线程对此类方法的调用:

1) 模式1 - 阻塞调用线程:调用线程将阻塞直到方法返回。换句话说,编译器会自动编写代码以使调用线程阻塞。调用线程传递的任何参数都将被复制到主线程私有(private)的变量中。在主机线程接收到控制权之前,该方法不会执行。当宿主线程退出方法时,调用线程将被释放,并将方法返回的任何结果复制到它自己的私有(private)变量空间中。

2) 模式 2 - 不要阻塞调用线程:这将允许回调函数的附加参数。由外部线程传递给该方法的任何参数都将被复制到线程的私有(private)变量空间中。编译器将再次保持方法的执行,直到宿主线程接收到控制权,但会让调用线程继续而不阻塞。当宿主线程完成方法的执行时,如果指定了回调函数,它将调用该函数**但在调用该方法的原始线程的上下文中,而不是在宿主线程上下文中**。

至少对我来说,提供这种自动线程处理的语言会比我现在必须做的多线程更有趣。有没有人见过提供这种多线程模型的编程语言或主流语言之一的模块/hack?

最佳答案

我不认为它完全符合你的描述,但是 Erlang提供了我见过的最简单的并发模型之一。它使用无共享的方法,这听起来可能对您有吸引力,也可能不吸引人,但我发现它真的很有趣。如果您有需要,使用它创建分布式系统也非常容易。查看 "Getting Started with Erlang" ,这是一个很棒的教程,几乎涵盖了该语言的所有部分。

关于multithreading - 有没有人见过像这样处理线程的编程语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1090455/

相关文章:

带有 os.chdir 和 c/fortran 程序的 python 线程

c - 根据 settimeofday 调整基于 CLOCK_REALTIME 的计时器

c - 仅在 POSIX 上打开文件

c - GNU C 使用管道的多进程处理

c - pthread 回调中断用户输入

c - pthread 中的意外输出

c++ - 关于多线程的问题

ios - 手动调用 viewWillAppear() 时出错(Objective-C)

vb.net - 无法从另一个线程向 DataTable 添加行

c# - 需要帮助跨 UI 线程和 C# 中的另一个线程获取信息