1

仅使用 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 循环中旋转。另一方面,使用自动重置事件对象只会释放一个等待线程。

另外,我需要主线程等待所有线程完成。我厌倦了几种不同的方法,但我无法让它发挥作用。我想我才刚刚开始意识到多线程编程有多难。

编辑:语法

4

2 回答 2

0

工作线程可以设置为低(er)优先级(GUI(主)线程具有正常优先级)。它并没有真正减慢速度(只要您不在主线程中执行任何操作,使其保持忙碌),并且您的应用程序将对用户输入做出更快的响应。此外,在thread_proc() 中,如果“没有找到工作”,工作线程可能会以某种方式让步,例如等待(睡眠)一秒钟左右。

另一种方法是使用 APC。

于 2012-05-08T15:43:01.100 回答
0

这是一个非常糟糕的主意:

1) 正如您所发现的,微管理线程非常困难且容易出错。绕过它的方法是不这样做。

2) 在 GUI 线程中等待工作线程完成(或者实际上,等待任何事情),这很糟糕。当工作线程完成时向 GUI 线程发出信号,例如。通过 PostMessage()ing,很好。

好的,您有多个执行相同线程过程的工作线程。它们运行相同的代码,因此很明显,它们对不同的数据进行操作。您能否提供更多有关线程操作的数据的详细信息?我怀疑您最终会将任务对象/结构排队到线程池中,但我们需要更多详细信息。

多线程编程并不是那么困难——它只是不同:) 最重要的细节——它与代码无关,(或者,理想情况下,任何线程实例),它都是关于你如何管理数据的——它是如何分区的以及它是如何移动的大约。可悲的是,这也是为了避免网络上比比皆是的如何不做线程的非常糟糕的例子:(

于 2012-05-04T21:39:54.563 回答