Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确保多线程时两条语句按顺序运行?_C#_Multithreading - Fatal编程技术网

C# 如何确保多线程时两条语句按顺序运行?

C# 如何确保多线程时两条语句按顺序运行?,c#,multithreading,C#,Multithreading,我需要知道如何让一小段相邻的代码按顺序运行,而不让任何其他线程占用CPU时间 if (status != Status.Pending) return; status = Status.Locked; 背景 我正在开发一个应用程序,在主线程上有一个用户界面,它填充了一系列优秀的异步任务,这些任务都是由一大群助手线程所完成的。在意识到这些活动是内置的之前,我开始开发定制对象来表示这些活动。对于这个项目,我想继续使用我的自定义任务类对象 我让线程等待任务出现在列表中,然后第一个锁定它

我需要知道如何让一小段相邻的代码按顺序运行,而不让任何其他线程占用CPU时间

if (status != Status.Pending) 
    return;

status = Status.Locked;

背景 我正在开发一个应用程序,在主线程上有一个用户界面,它填充了一系列优秀的异步任务,这些任务都是由一大群助手线程所完成的。在意识到这些活动是内置的之前,我开始开发定制对象来表示这些活动。对于这个项目,我想继续使用我的自定义任务类对象

我让线程等待任务出现在列表中,然后第一个锁定它的线程将保留它。每个任务的第一行用于将其状态设置为“已锁定”-但即使在查找任务和锁定任务之间的微小间隙中,多个线程偶尔也会执行相同的任务


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

Thread.CurrentThread.Priority = ThreadPriority.Highest;
但从同一个网站上可以看出,在一段时间内,所有的任务都得到了足够的关注,以至于我不能依靠一个高优先级的线程来完成它的工作。我认为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
哦,还有我们光荣的领袖杰夫·阿特伍德提出的想法


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

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

还有什么? 我还有什么其他选项可以确保我可以检查某个东西是否被锁定,然后在代码可以同时运行时将其锁定或退出?欢迎使用内置任务对象的示例


被标记为复制品。我说,丹尼尔·希尔加思的基本答案是否定的,你不能让我偏离这个方向。正如评论中所指出的,我对一个典型的XY问题嗤之以鼻——但这对我来说很容易识别,只是事后诸葛亮而已。

这句话中的“完成一系列优秀异步任务的线程”——是解决问题的关键。您不需要同步任务的执行。您需要同步从队列中提取的

最简单的方法是首先使用并发线程,这样任何两个线程都无法将同一项(在您的情况下为任务)出列

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

请记住,我假设您没有使用基于任务的异步模式。如果你这样做了,也有一些内置的机制来实现你想要的行为。

这句话中的“填充一系列未完成异步任务的线程”是解决问题的关键。您不需要同步任务的执行。您需要同步从队列中提取的

最简单的方法是首先使用并发线程,这样任何两个线程都无法将同一项(在您的情况下为任务)出列

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


请记住,我假设您没有使用基于任务的异步模式。如果你这样做了,也有一些内置的机制来实现你想要的行为。

你正在解决一个XY问题。您声明的问题是“如何确保这两行之间的特定线程不会被任何东西打断”,但您实际的问题是“如何正确编写多线程代码”-答案太宽泛了。
可能重复联锁。compareeexchange
“多个线程偶尔执行相同的任务”-然后您只需同步任务队列。。。或者最好首先使用并发操作系统。Windows不是实时操作系统。用户应用程序无法阻止上下文切换。这是在Win16上进行协作多任务处理的糟糕日子里发生的,结果不太好。如果希望一个线程不参与另一个线程的业务,请使用互斥(使用
lock
语句,或者,如果正在执行任务,则使用互斥)。这里没有竞争条件——一个锁,一个所有者。你在这里解决一个XY问题。您声明的问题是“如何确保这两行之间的特定线程不会被任何东西打断”,但您实际的问题是“如何正确编写多线程代码”-答案太宽泛了。
可能重复联锁。compareeexchange
“多个线程偶尔执行相同的任务”-然后您只需同步任务队列。。。或者最好首先使用并发操作系统。Windows不是实时操作系统。用户应用程序无法阻止上下文切换。这是在Win16上进行协作多任务处理的糟糕日子里发生的,结果不太好。如果希望一个线程不参与另一个线程的业务,请使用互斥(使用
lock
语句,或者,如果正在执行任务,则使用互斥)。那里没有比赛条件——一把锁,一个主人。@Downvoter:你想解释一下吗?我愿意学习!我根据这个建议解决了我的问题。现在对我来说似乎很明显:-以前,存在一个列表,线程从列表中提取问题。有可能两个线程发生冲突