【发布时间】:2010-04-24 16:39:44
【问题描述】:
编辑:我有点太晚了(?)我在第一次更新这个问题时发布的所有代码对于大多数读者来说太多 .实际上,我已经继续前进了,written a blog post about this topic 供任何愿意阅读它的人使用。
与此同时,我将原始问题留在原处,简要介绍一下我想解决的问题。
我还要注意,到目前为止,我发布的代码(在我的博客上)已经很好地经受住了测试。但我仍然对人们愿意就它的干净/稳健/性能*提供的任何和所有反馈感兴趣。
*我喜欢doesn't really mean what we think这个词,但我们开发人员一直都在使用它。
原始问题
抱歉,问题标题含糊不清——不知道如何简洁地概括我在下面提出的问题。 (如果有编辑权限的人能想到一个更具描述性的标题,请随意更改。)
我需要的行为是这样的。我正在设想一个在其构造函数中接受单个委托任务的工作类(为简单起见,我将使其不可变——实例化后不能再添加任务)。我将此任务称为T。该类应该有一个简单的方法,比如GetToWork,它会表现出这种行为:
- 如果工作人员当前没有运行
T,那么它将立即开始运行。 - 如果工作人员正在当前运行
T,那么一旦完成,它将立即再次启动T。 -
GetToWork可以在 worker 运行时调用任意次数T;简单的规则是,在T的任何执行期间,如果GetToWork被调用至少一次,T将在完成后再次运行(然后如果GetToWork被调用而@ 987654334@ 正在运行那个时间,它会再次重复,等等)。
现在,使用布尔开关非常简单。但是这个类需要线程安全,我的意思是,上面的步骤 1 和 2 需要包含原子操作(至少我认为是这样)。
增加了一层复杂性。我需要一个“工人链”课程,它将由许多连接在一起的工人组成。一旦第一个工作人员完成,它实际上会在 after 工作人员上调用GetToWork;同时,如果它自己的GetToWork 已被调用,它也会重新启动自己。从逻辑上讲,在 链 上调用 GetToWork 与在链中 的第一个工人上调用 GetToWork 基本相同(我完全打算不公开该链的工人可访问)。
想象这个假设的“工人链”会如何表现的一种方法是将其与接力赛中的团队进行比较。假设有四个跑步者,W1 到W4,让链被称为C。如果我打电话给C.StartWork(),应该是这样的:
- 如果
W1在他的起点(即什么都不做),他将开始向W2跑。 - 如果
W1已经跑向W2(即执行他的任务),那么一旦他到达W2,他就会向W2发信号开始,立即返回到他的起点,因为StartWork已经被调用,再次开始向W2跑。 - 当
W1到达W2的起点时,他会立即回到自己的起点。- 如果
W2只是坐在那里,他会立即开始跑向W3。 - 如果
W2已经跑向W3,那么W2将在到达W3并返回起点后再次运行。
- 如果
上面的内容可能有点令人费解并且写得不好。但希望你能得到基本的想法。显然,这些工作线程将在自己的线程上运行。
另外,我猜这个功能可能已经存在于某个地方?如果是这样,一定告诉我!
【问题讨论】:
-
如果您尝试过,请发布代码。如果您还没有尝试...好吧..尝试然后发布代码。 ;-)
-
@Sky:很公平。我正在处理这个问题,当我有你知道的东西时,我会发布我所拥有的东西。 (现在它基本上写了一半,所以我发布了这个问题以寻求帮助。)
-
我的理由是对于基本概念,例如“我如何将类名添加到 html 元素”这个问题足以表明用户需要一些帮助来学习某些东西,并且提供指导的工作很少。在这种情况下,您已经为一个不太重要的构造提供了详细的需求文档,并且能够回答这个问题需要大量的努力,虽然我和其他人不介意提供不太重要的指导,但这不是“请为我的网站编写代码。我绝不是在暗示这是你的意图,只是说......
-
对于这样的事情,您尝试完成的示例将大大有助于为问题提供上下文,并且老实说,将证明您付出了很多努力将证明另一方付出的努力是合理的。请不要误会;我对这个问题很感兴趣,如果可以的话,我会回答它。
-
@Sky Sanders:我完全理解你来自哪里。代码正在开发中。
标签: .net multithreading synchronization