如何等待所有其他线程完成其任务?
我有几个线程使用类似于下面的代码的方式消耗队列中的任务。问题在于,有一种类型的任务在处理任何其他任务时无法运行。
这就是我所拥有的:
while (true) // Threaded code
{
while (true)
{
lock(locker)
{
if (close_thread)
return;
task = GetNextTask(); // Get the next task from the queue
}
if (task != null)
break;
wh.WaitOne(); // Wait until a task is added to the queue
}
task.Run();
}
这就是我所需要的:
while (true)
{
while (true)
{
lock(locker)
{
if (close_thread)
return;
if (disable_new_tasks)
{
task = null;
}
else
{
task = GetNextTask();
}
}
if (task != null)
break;
wh.WaitOne();
}
if(!task.IsThreadSafe())
{
// I would set this to false inside task.Run() at
// the end of the non-thread safe task
disable_new_tasks = true;
Wait_for_all_threads_to_finish_their_current_tasks();
}
task.Run();
}
问题是我不知道如何在不造成混乱的情况下实现这一目标。
I have several threads consuming tasks from a queue using something similar to the code below. The problem is that there is one type of task which cannot run while any other tasks are being processed.
Here is what I have:
while (true) // Threaded code
{
while (true)
{
lock(locker)
{
if (close_thread)
return;
task = GetNextTask(); // Get the next task from the queue
}
if (task != null)
break;
wh.WaitOne(); // Wait until a task is added to the queue
}
task.Run();
}
And this is kind of what I need:
while (true)
{
while (true)
{
lock(locker)
{
if (close_thread)
return;
if (disable_new_tasks)
{
task = null;
}
else
{
task = GetNextTask();
}
}
if (task != null)
break;
wh.WaitOne();
}
if(!task.IsThreadSafe())
{
// I would set this to false inside task.Run() at
// the end of the non-thread safe task
disable_new_tasks = true;
Wait_for_all_threads_to_finish_their_current_tasks();
}
task.Run();
}
The problem is I don't know how to achive this without creating a mess.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
尝试使用 TreadPool,然后使用 WaitHandle.WaitAll 方法来确定所有线程都已完成执行。
MSDN
Try looking to using a TreadPool and then using the WaitHandle.WaitAll method to determine that all threads have finished executing.
MSDN
WaitHandle.WaitAll(autoEvents); 也许这就是你想要的。
WaitHandle.WaitAll(autoEvents); Maybe this is what you want.
您可以将其视为类似于允许任意数量的读取器或一个写入器的数据结构。也就是说,任意数量的线程都可以读取该数据结构,但写入该数据结构的线程需要独占访问。
在您的情况下,您可以运行任意数量的“常规”线程,也可以有一个需要独占访问的线程。
.NET 具有
ReaderWriterLock
和ReaderWriterLockSlim
类,您可以使用它们来实现这种共享。不幸的是,这两个类在 xbox 上都不可用。但是,可以通过
Monitor
和ManualResetEvent
对象的组合来实现读取器/写入器锁定。我没有 C# 示例(既然我可以访问本机对象,为什么要这样做?),但是有一个 简单的 Win32 实现,移植起来应该不会太困难。You can think of this as similar to a data structure that allows any number of readers, or one writer. That is, any number of threads can read the data structure, but a thread that writes to the data structure needs exclusive access.
In your case, you can have any number of "regular" threads running, or you can have one thread that requires exclusive access.
.NET has the
ReaderWriterLock
andReaderWriterLockSlim
classes that you could use to implement this kind of sharing. Unfortunately, neither of those classes is available on the xbox.However, it possible to implement a reader/writer lock from a combination of
Monitor
andManualResetEvent
objects. I don't have a C# example (why would I, since I have access to the native objects?), but there's a simple Win32 implementation that shouldn't be terribly difficult to port.你可以使用这样的东西,
希望这有帮助。
you can use something like this,
Hope this help.