提醒:我不是很熟悉线程池的工作,这从下面的代码中可能是显而易见的。我的印象是,我可以将许多值推入这个队列,然后它将等待一个线程完成,然后移动到下一个线程,系统将处理要运行多少线程的同步。
我试图使用ThreadPool::QueueUserWorkItem(waitcallback, num),其中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++。