有很多线程的线程池queueuserworkitem
单挑:我不熟悉使用线程池,这可能会从下面的代码中看出来。我的印象是,我可以将许多值推入该队列,然后等待一个线程完成,然后转到下一个线程,系统将处理要运行多少个线程的同步。有很多线程的线程池queueuserworkitem
我想使用ThreadPool :: QueueUserWorkItem(waitcallback,num)其中的值被迭代到动态值取决于一些先前的算法。我遇到的问题是程序崩溃时,它太高。
WaitCallback^ wcb = gcnew WaitCallBack(this, &createImage);
for(int i = 0; i < numBlocks; i++)
{
ThreadPool::QueueUserWorkItem(wcb, i);
}
我得到的消息“运行时错误!此应用程序已请求运行时终止它在一个不寻常的方式,请联系应用程序的支持团队以获取更多信息。”
我最反感通过了numBlocks运行= 644
这很难说是什么原因造成程序崩溃。很可能,其中一个线程抛出了异常,并导致程序失效。你必须确定你的代码在哪里抛出异常。
如您所知,ThreadPool::QueueUserWorkItem
队列由线程池处理的项目。但是可能有多个线程处理来自该队列的项目。例如,您可以有20个池线程,其中15个处理您排队的工作项。
如果你真的有很多项目需要处理,而且你希望他们一次完成一个项目,那么为什么不排列一个线程来一次完成一项。我从来没有做过托管的C++,所以我不会试着用它写一个例子。但是,也许你能翻译此C#代码:
void ProcessInBackground(object state)
{
int numBlocks = (int)state;
for (int i = 0; i < numBlocks; ++i)
{
createImage(i);
}
}
然后你就可以把它叫做:
ThreadPool::QueueUserWorkItem(ProcessInBackground, numBlocks);
,创建一个单独的线程会按顺序处理的项目。
我怀疑你可以很容易地将它转换为托管C++。
我让他们一次排队运行1,但之后程序花了4天才完成。我需要拆分进程,以便它不是线性的,而是一次运行多个转换(createImage(int))。我正在尝试生成并管理createImage函数的多个线程。我可以手动完成,但我认为QueueUserWorkItem,基于我的机器优化了程序 – 2013-03-26 15:06:01
@GeneParmesan:你应该看看“Parallel.ForEach”和Task Parallel Library。那些将比使用'ThreadPool' API轻松完成分配线程的工作更好。 – 2013-03-26 18:40:17
你的代码叫做terminate()。这通常是因为非托管代码抛出了一个C++异常,并没有被捕获。与您发布的代码段无关。确保使用以混合模式运行的调试器来调试代码。 – 2013-03-26 17:22:06
如果是这样的话,它可能与我进行图像转换有关,因为在我以线性方式运行任务之前,我始终能够假定文件已关闭,正在读取。现在,我问,这种类型的异常可能来自多个线程试图打开同一个文件吗? – 2013-03-26 17:53:02
当然,这是行不通的。它不需要多个线程,你一定需要改进你的错误处理。 – 2013-03-26 17:58:34