控制使用win32 API执行相同线程proc的多个工作线程的最佳做法是什么?
我尝试了很多替代品,但我无法做到。我当前的代码看起来像这样:
// thread proc
DWORD WINAPI thread_proc(LPVOID param) {
while(1) {
WaitForSingleObject(start_event, INFINITE);
// Do some work HERE
// Work finished, go back to waiting for new work
}
}
// main proc
int main(void) {
// create enough worker threads
CreateThread(... thread_proc...);
CreateThread(... thread_proc...);
...
// Wait for work here
// start work by raising event
SetEvent(start_event);
ResetEvent(start_event);
基本上我使用事件来启动多个工作线程但当然这不能按预期工作。如果主线程在SetEvent()和ResetEvent()之间中断,则工作线程将在while循环中旋转。 另一方面,使用自动重置事件对象只会释放一个等待线程。
另外,我需要主线程等待所有线程完成。我厌倦了一些不同的方法,但我无法使它工作。我想我刚刚开始意识到多线程编程是多么困难。
编辑:语法答案 0 :(得分:0)
这是一个非常糟糕的主意:
1)正如您所发现的那样,微管理线程非常困难且容易出错。绕过它的方法是不要这样做。
2)在GUI线程中等待工作线程完成,(或者实际上,对于任何事情),只是不好。在工作线程完成时发信号通知GUI线程,例如。通过PostMessage(),很好。
好的,你有多个工作线程执行相同的线程proc。它们运行相同的代码,显然,它们运行在不同的数据上。你能提供一些关于线程操作数据的更多细节吗?我怀疑你最终将任务对象/结构排队到一个线程池,但我们需要更多细节。
多线程编程并不是那么困难 - 它只是不同:)最重要的细节 - 它与代码无关(或者,理想情况下,任何线程实例),它都是关于如何管理数据 - 它是如何分区的它是如何移动的。可悲的是,这也是为了避免在网上出现如何不做线程的非常糟糕的例子:(
答案 1 :(得分:0)
可以将工作线程设置为低(呃)优先级(GUI(主)线程具有正常优先级)。它并没有真正减慢速度(只要你不在主线程中执行任何操作,让它保持忙碌),你的应用程序将对用户输入更敏感。此外,在thread_proc()中,如果“找不到工作”,工作线程可以某种方式产生,例如等待(休眠)一秒左右。
另一种方法是使用APC。