我正在使用c ++中的winapi创建一个程序。该程序涉及两个线程。我使用CreateThread创建其中一个线程。问题是CreateThread在创建线程之前不会阻塞。这会导致问题,因为我在线程之间发送消息,并且线程在创建线程之前不会收到任何消息。如何解决这个问题。
答案 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)
您的方案是您有两个线程,在这两个线程之间发送消息。父线程需要发送消息,但子线程需要在能够接收之前执行初始化。这会产生时间依赖性。
一个选项是使用一个事件让孩子向父母发出信号,告知他已完成初始化并准备接收消息。父级创建事件,将其传递给线程,然后等待事件。线程执行初始化,然后发出事件信号。
这种方法效果很好,但对我来说似乎是不必要的复杂。为什么启动一个线程然后阻塞直到它已经执行了工作?对我来说,这违背了线程的目的。
所以另一种方法是避免这种阻塞。由于在执行消息队列结构的初始化之前父线程无法继续,因此我们将该初始化移动到父线程。然后就不需要事件而且不需要阻止。