- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有三个线程,部分代码可以并行运行,某些部分被锁定(当时只有一个线程)。但是,一把锁只需要按顺序放开它们即可。由于这是一个循环,因此变得更加复杂。我该如何做这种行为?
如果我有打印声明,我希望收到以下输出:
1,2,3,1,2,3,1,2,3 ....目前我收到2,3,1,3,1,3,2,1,2 A.K.A.随机顺序。
在三个线程中并行执行的代码:
while (true){
lock (fetchLock){
if(done){
break;
}
//Do stuff one at the time
}
//Do stuff in parralell
lock (displayLock){
//Do stuff one at the time but need's to be in order.
}
}
最佳答案
您可以结合使用 Barrier
和 AutoResetEvent
来实现此目的。
首先,您使用Barrier.SignalAndWait()
来确保所有线程在继续之前达到一个共同点。这个共同点是您希望线程按顺序执行一些代码的点。
然后,使用numberOfThreads-1
AutoResetEvents同步线程。第一个线程不需要等待任何其他线程,但是在完成后,它应该发出事件通知下一个线程正在等待。
中间线程(或多个线程,如果总数超过3个线程)需要等待前一个线程发出信号,通知该事件继续进行。完成后,中间线程应发出信号通知下一个线程正在等待。
最后一个线程需要等待上一个线程发出信号,告知事件继续进行。由于它是最后一个线程,因此不需要发信号通知下一个线程继续进行。
最后,将线程与另一个对Barrier.SignalAndWait()
的调用重新同步。
这是最容易通过示例控制台应用程序显示的。如果运行它,您将看到线程应该按顺序完成的工作(在输出中以字母“B”为前缀)确实总是按顺序进行的,而其他工作(以字母“A”为前缀) “)以随机顺序执行。
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Demo
{
public static class Program
{
public static void Main()
{
using (Barrier barrier = new Barrier(3))
using (AutoResetEvent t2 = new AutoResetEvent(false))
using (AutoResetEvent t3 = new AutoResetEvent(false))
{
Parallel.Invoke
(
() => worker(1, barrier, null, t2),
() => worker(2, barrier, t2, t3),
() => worker(3, barrier, t3, null)
);
}
}
private static void worker(int threadId, Barrier barrier, AutoResetEvent thisThreadEvent, AutoResetEvent nextThreadEvent)
{
Random rng = new Random(threadId);
for (int i = 0; i < 1000; ++i)
{
doSomething(threadId, rng); // We don't care what order threads execute this code.
barrier.SignalAndWait(); // Wait for all threads to reach this point.
if (thisThreadEvent != null) // If this thread is supposed to wait for a signal
thisThreadEvent.WaitOne(); // before proceeding, then wait for it.
doWorkThatMustBeDoneInThreadOrder(threadId);
if (nextThreadEvent != null) // If this thread is supposed to raise a signal to indicate
nextThreadEvent.Set(); // that the next thread should proceed, then raise it.
barrier.SignalAndWait(); // Wait for all threads to reach this point.
}
}
private static void doWorkThatMustBeDoneInThreadOrder(int threadId)
{
Console.WriteLine(" B" + threadId);
Thread.Sleep(200); // Simulate work.
}
private static void doSomething(int threadId, Random rng)
{
for (int i = 0; i < 5; ++i)
{
Thread.Sleep(rng.Next(50)); // Simulate indeterminate amount of work.
Console.WriteLine("A" + threadId);
}
}
}
}
关于c# - 如何使用C#使线程按顺序通过门,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28453347/
我想实现一个 bool NAND/NOR 门。问题是我在代码本身中即时学习的门没有输入,即我事先不知道它可能有多少输入。以下是 OR 的代码。但我想不出一种方法来为 NOR/NAND 做这件事。结果的
我正试图找到用 C 语言编写 XNOR 门的最有效方法。 if(VAL1 XNOR VAL2) { BLOCK; } 有什么建议吗? 谢谢。 最佳答案 有两个操作数,这很简单: if (val
我正在尝试进行 laravel 基本授权。我正在使用 gate 进行 laravel 授权。 表结构 User Table, Permission Table, Role, role_permissi
据我所知,我们有一个Youtube API,可通过使用以下API详细信息来获取基于某个地区的趋势YouTube视频: https://developers.google.com/youtube/v3/
我有一个看起来像这样的出租车列表: 1204725 2162 1300163 420247 我希望从上面的taxids中按顺序获得一个带有分类ID的文件: kingdom_id phylum
我一直在尝试弄清楚如何制作“ HitTest 门帖子”,其中帖子是按在最短的时间内获得最多支持排序的。 我有 2 个数据库表: 有趣的帖子: fun_post_upvotes: 我的最新代码仍然不起作
如何通过 Windows API 调用打开 CD/DVD 门? 最佳答案 如果您使用 .NET,这将起作用: http://www.dotnetspider.com/resources/15834-e
我们的核心目标是: 使用图像处理来读取/扫描建筑平面图图像(从 CAD 软件导出) 使用图像处理来读取/扫描建筑平面图图像(从 CAD 软件导出)提取各种直线和曲线,将它们分组为结构实体,如墙、柱、梁
给定 n 个元素 1,2,.........,n 上的二叉搜索树的后序遍历 P。您必须确定以 P 作为其后序遍历的唯一二叉搜索树。执行此操作的最有效算法的时间复杂度是多少? (a) theeta(lo
根据定义,门 1/sqrt(5) (I + 2iZ) 应作用于量子位 a|0> + b|1> 以将其转换为 1/sqrt (5) ((1+2i)a|0> + (1-2i)b|1>) 但每个 RUS 步
我有物种的分类 ID,我可以从 NCBI ( https://www.ncbi.nlm.nih.gov/Taxonomy/TaxIdentifier/tax_identifier.cgi ) 获得物种
我是一名优秀的程序员,十分优秀!