我有一个并行算法,我遇到了一些障碍问题。在你们都尖叫“搜索”之前,我可以说我已经查看了可用的帖子和链接,并且我已经按照 Monitor.Wait 和 Monitor.PulseAll 的屏障说明进行操作,但我的问题是除了最后一个线程之外的所有线程都创建了(并启动) PulseAll 从我的主线程到达。以下是代码的基本布局:
public static object signal = new object(); //This one is located as class variable, not in the method
public void RunAlgorithm(List<City> cities){
List<Thread> localThreads = new List<Thread>();
object[] temp = //some parameters here
for(int i = 0; i < numOfCitiesToCheck; i++){
Thread newThread = new Thread((o) => DoWork(o as object[]));
newThread.IsBackground = true;
newThread.Priority = ThreadPriority.AboveNormal;
newThread.Start(temp as object);
localThreads.Add(newThread);
}
//All threads initiated, now we pulse all
lock(signal){
Monitor.PulseAll(signal);
}
int counter = 0;
while(true){
if(counter == localThreads.Count){ break; }
localThreads[counter].Join();
counter++;
}
}
这就是主线程所做的(删除了一些不必要的部分),并且如前所述,主线程将始终卡在列表中最后一个线程的 Join() 中。这是线程方法的样子:
private void DoWork(object[] arguments){
lock(signal){
Monitor.Wait(signal);
}
GoDoWork(arguments);
}
我可以为这种类型的信号使用任何其他障碍吗?我想要的只是让主线程同时向所有线程发出信号,以便它们同时启动。我希望它们同时启动,以便尽可能接近并行(我测量算法的运行时间和其他一些事情)。我的障碍或代码的任何部分是否有缺陷(我的意思是障碍)?我尝试运行一个线程较少的实例,但它仍然卡在最后一个实例上,我不知道为什么会这样。我已经通过 VS debug 确认最后一个线程正在休眠(所有其他线程都是 !isAlive,而最后一个是 isAlive = true)。任何帮助表示赞赏!