控制Windows(本机)中的工作线程的最佳实践?

时间:2012-05-04 21:24:08

标签: multithreading winapi synchronization worker

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

另外,我需要主线程等待所有线程完成。我厌倦了一些不同的方法,但我无法使它工作。我想我刚刚开始意识到多线程编程是多么困难。

编辑:语法

2 个答案:

答案 0 :(得分:0)

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

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

2)在GUI线程中等待工作线程完成,(或者实际上,对于任何事情),只是不好。在工作线程完成时发信号通知GUI线程,例如。通过PostMessage(),很好。

好的,你有多个工作线程执行相同的线程proc。它们运行相同的代码,显然,它们运行在不同的数据上。你能提供一些关于线程操作数据的更多细节吗?我怀疑你最终将任务对象/结构排队到一个线程池,但我们需要更多细节。

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

答案 1 :(得分:0)

可以将工作线程设置为低(呃)优先级(GUI(主)线程具有正常优先级)。它并没有真正减慢速度(只要你不在主线程中执行任何操作,让它保持忙碌),你的应用程序将对用户输入更敏感。此外,在thread_proc()中,如果“找不到工作”,工作线程可以某种方式产生,例如等待(休眠)一秒左右。

另一种方法是使用APC。