0

我正在研究一种 C# 编程,该编程相当适合该语言。我想我对一般的面向对象编程有很好的理解,以及运行多线程意味着什么,在高层次上,但实际实现我是如所说的擦洗。

我要做的是创建一个工具,该工具将使许多线程独立运行并相互交互,每个线程都将服务于自己的任务并可以调用其他线程。

我确保通信的策略(在不同线程同时发生多个更新时不会丢失任何东西)是在每个类上创建一个可以称为外部的类似假脱机的任务,并将任务添加到给定线程,或为这些线程添加假脱机服务。我不确定我是否应该将它放在班级或外部,并让班级本身为新任务调用假脱机并跟踪假脱机。在这里,我特别考虑如何在空线轴获得任务时向班级发出信号(侦听器方法,因此如果任务想要在新东西到达时被唤醒,则可以订阅池),或者“每 X 秒检查一次,如果出来任务和下一个任务未安排”的方法

创建这个的好策略是什么,我应该在实际班级还是外部创建这个?实现中的关键区域是什么,因为“忙等待检查”允许它只在添加新作业和删除实际 spool 上的作业,而信号将需要添加/删除作业,还需要 goto sleep on 信号是关键的,并且突然增加了对如果进入关键区域的假脱机的高要求,因为这可能会导致阻塞,导致其他阻塞,以及可能的不可预见的死锁。

4

1 回答 1

1

我经常在各种系统上使用这样的模型。我为代理定义了一个类,例如“AgentClass”,为请求定义一个类,例如“RequestClass”。代理有两个抽象方法,“submit(RequestClass *message)”和“signal()”。通常,代理中的线程构造一个生产者-消费者队列并在其上等待 RequestClass 实例,submit() 方法将传递的 RequestClass 实例排队到队列中。RequestClass 通常包含一个“命令”枚举,它告诉代理需要做什么,以及执行请求所需的所有数据和“发送者”代理实例。当代理收到请求时,它会打开枚举以调用正确的函数来执行请求。代理仅作用于 RequestClass 中的数据 - 结果、错误消息等。被放置在 RequestClass 的数据成员中。当代理执行请求(或失败并生成错误数据)时,它可以 submit() 将请求返回给发送方(即请求已异步执行),或者调用发送方的 signal() 函数,它发出发送者正在等待的事件的信号(即请求是同步执行的)。

我通常在启动时构造固定数量的 RequestClass 实例并将它们存储在全局“池”PC 队列中。任何需要发送请求的代理/线程/任何东西都可以使 RequestClass 实例出列,填写数据,将其提交()到代理,然后异步或同步等待请求被执行。完成后,RequestClass 将返回到池中。我这样做是为了避免连续的 malloc/free/new/dispose,简化调试,(我使用计时器将池级别转储到状态栏,所以我总是注意到请求是否泄漏或被双重释放),并消除需要在应用程序关闭时显式终止线程,(如果多个线程只读取/写入超过应用程序表单等的数据区域,

这种消息传递设计对死锁具有很强的抵抗力,因为唯一的锁(如果有的话)在 PC 队列中,但如果你足够努力,你当然可以实现它:)

这是您似乎需要的那种系统,还是我弄错了?

Rgds,马丁

于 2011-09-12T12:29:22.313 回答