如何在多线程的同时确保两个语句按顺序运行?

时间:2017-09-01 11:40:35

标签: c# multithreading

我需要知道如何在没有任何其他线程能够拥有CPU时间的情况下依次运行一小段相邻的代码行。

if (status != Status.Pending) 
    return;

status = Status.Locked;

背景

我正在主线程上开发一个带有用户界面的应用程序,该主线程填充了一大堆辅助线程所消除的未完成的异步任务。在开始意识到tasks是内置的之前,我开始开发自定义对象以表示这些活动。对于这个项目,我想继续使用我的自定义任务对象。

我有线程等待任务显示在列表中,然后第一个锁定它会保留它。用于将其状态设置为Locked的每个任务的第一行行 - 但即使在查找任务和锁定任务之间的微小差距中,多个线程偶尔会执行相同的任务。

优先事项,优先事项

我的第一个想法是研究如何处理线程的优先级。 This documentation似乎描述了我所希望的 - 高优先级线程在任何低优先级线程之前占用所有资源。这似乎是一个好主意,如果我的工作代码之前暂时提高当前线程的优先级。

Thread.CurrentThread.Priority = ThreadPriority.Highest;

但是从同一个网站this code example显示,在一段时间内,任务都得到足够的重视,我无法依靠一个高优先级的线程完成其工作。我希望CPU中的多核是罪魁祸首。

// The example displays output like the following:
//    ThreadOne   with      Normal priority has a count =   755,897,581
//    ThreadThree with AboveNormal priority has a count =   778,099,094
//    ThreadTwo   with BelowNormal priority has a count =     7,840,984

哦,here is the nail in the coffin我们光荣的领导人杰夫阿特伍德提出了这个想法。

冻结!

我的下一个想法是暂时冻结所有其他辅助线程,然后在我的块完成后解冻它们。乌尔克!在多核CPU环境中,我可以想象这个代码可能同时在两个内核上运行;这将是游戏结束。

foreach (Thread thread in ActivityQueue.threads)
    if (thread != Thread.CurrentThread)
        thread.Suspend();

还有什么?

我还有哪些其他选项可以确保我可以检查某些内容是否已被锁定,然后在代码可以同时运行时将其锁定或退出?欢迎使用内置Task对象的示例。

This question被标记为重复。我说@Daniel Hilgarth的基本答案不,你不能指出我远离那个方向。正如评论中指出的那样,我对一个典型的XY问题感到嘘声 - 但我很容易只能在后视中识别出来。

1 个答案:

答案 0 :(得分:2)

“填充未完成的异步任务列表的线程” - 在该句中是您问题的关键。您不需要同步任务的执行。您需要同步从队列中取出

最简单的方法是首先使用并发的方法,因此任何两个线程永远都不能出列同一个项目(在你的情况下是任务)。

例如,

BlockingCollection除了并发之外还提供了许多其他便利。例如:您可以在不使用旋转/等待的情况下等待项目的可用性。您可以轻松地发出“不再需要的物品”的信号,以优雅地终止消费者......

请注意,我假设您没有使用基于任务的异步模式。如果这样做,还有内置的机制来实现您期望的行为。