确保线程已启动winapi c ++

时间:2014-07-01 14:47:06

标签: c++ multithreading winapi

我正在使用c ++中的winapi创建一个程序。该程序涉及两个线程。我使用CreateThread创建其中一个线程。问题是CreateThread在创建线程之前不会阻塞。这会导致问题,因为我在线程之间发送消息,并且线程在创建线程之前不会收到任何消息。如何解决这个问题。

2 个答案:

答案 0 :(得分:5)

使用CreateEvent创建一个事件句柄,让你等待线程A.你在线程B中做的第一件事是发出该事件的信号。

struct thread_data {
    /* ... */
    HANDLE started_event;
};

主题A:

/* We can create this on the stack. We wait for thread_B to
 * copy it into its own stack before signalling the event. */
struct thread_data td;

td.started_event = CreateEvent(
    NULL  /* security attributes */,
    FALSE /* manual reset (=NO) */,
    FALSE /* initially signalled (=NO) */,
    NULL  /* name (=none) */ );

CreateThread(NULL, 0, thread_B, &td, 0, NULL);
WaitForSingleObject(td.started_event, INFINITE);
CloseHandle(td.started_event);

主题B:

DWORD WINAPI thread_B(LPVOID data)
{
    /* local copy of thread data */
    thread_data td = *((thread_data*)data);
    SetEvent(td.started_event);

    /* ... */
}

答案 1 :(得分:-1)

您的方案是您有两个线程,在这两个线程之间发送消息。父线程需要发送消息,但子线程需要在能够接收之前执行初始化。这会产生时间依赖性。

一个选项是使用一个事件让孩子向父母发出信号,告知他已完成初始化并准备接收消息。父级创建事件,将其传递给线程,然后等待事件。线程执行初始化,然后发出事件信号。

这种方法效果很好,但对我来说似乎是不必要的复杂。为什么启动一个线程然后阻塞直到它已经执行了工作?对我来说,这违背了线程的目的。

所以另一种方法是避免这种阻塞。由于在执行消息队列结构的初始化之前父线程无法继续,因此我们将该初始化移动到父线程。然后就不需要事件而且不需要阻止。

  1. 在父线程中初始化消息队列结构。
  2. 创建子线程传递消息队列结构。
  3. 排队邮件。