_beginthread和WaitForSingleObject

我正在执行一个启动4个线程的程序。

function是:

void* SOURCE_in(struct SOURCE_1*); void* SOURCE_out(struct SOURCE*); void* SINK_out(struct SINK_1*); void* SINK_in(struct SINK*); 

这些function允许4个块之间的通信。 块1与块2进行通信。块2与第三块共享信息。 方框3与方框4传达信息。

我的问题是在main.c中

 int main(int argc, char** argv){ extern int p, e_source, e_sink_1, l_sink, l_source_1, flag, ctr_source; extern int ctr_source_1, ctr_sink, ctr_sink1; SOURCE source; /*C struct*/ SINK sink; /*C struct*/ SOURCE_1 source_1; /*C struct*/ SINK_1 sink_1; /*C struct*/ HANDLE CHT[4]; p = 0; e_source = flag = 0; l_sink = e_sink_1 = l_source_1 = 1; max = 5; ctr_source = ctr_source_1 = ctr_sink = ctr_sink_1 = 0; /*Initialize FIFO*/ F *f1 = fifo_init(10); F *f2 = fifo_init(10); /*Connect FIFO and modules*/ source.output_source = f1; sink.input_sink = f1; sink_1.output_sink = f2; source_1.input_source = f2; /*Create Threads*/ CHT[0] = (HANDLE)_beginthread((void (*)(void *))&SOURCE_out, 0, &f1); CHT[1] = (HANDLE)_beginthread((void (*)(void *))&SINK_in, 0, &f1); CHT[2] = (HANDLE)_beginthread((void (*)(void *))&SINK_out, 0, &f2); CHT[3] = (HANDLE)_beginthread((void (*)(void *))&SOURCE_in, 0, &f2); /* Wait until all threads have terminated */ WaitForSingleObject(CHT[0], INFINITE); WaitForSingleObject(CHT[1], INFINITE); WaitForSingleObject(CHT[2], INFINITE); WaitForSingleObject(CHT[3], INFINITE); getchar(); return 0;} 

我读了WaitForSingleObject函数不能用_beginthread ….但我的函数不是typesnunsigned __stdcall …

我build立了一个错误的程序,我使用断点来testing它,这是没问题的。 当我编译我有这个问题:

线程“Win32线程”(0x11ec)退出代码0(0x0)。 线程“Win32线程”(0x918)退出代码0(0x0)。 线程“Win32线程”(0x8a4)退出代码0(0x0)。 线程“Win32线程”(0x2a8)退出代码-1073741510(0xc000013a)。 线程“Win32线程”(0x12f8)退出代码-1073741510(0xc000013a)。 程序'[3984] SW = SW.exe:Native'已退出,代码为-1073741510(0xc000013a)。

程序永远不会到达函数getchar()

在做这个程序之前,我做了一个程序,在两个程序块之间进行通信,一个读取,另一个写入。 那样的话我没问题

如果我不使用函数WaitForSingleObject,则问题消失,但是我的程序几乎总是在完成之前停止。

每个线程使用的函数,停下来rest一下。 但是我想让其他人继续下去,直到它的摔伤。

_beginthread的文档解释说您不能使用其中一个等待函数:

以下示例代码演示了如何使用_beginthreadex返回的线程句柄和同步API WaitForSingleObject。 主线程在继续之前等待第二个线程终止。 当第二个线程调用_endthreadex时,它会使它的线程对象进入信号状态。 这允许主线程继续运行。 这不能用_beginthread和_endthread来完成,因为_endthread调用CloseHandle,在线程对象被设置为信号状态之前销毁线程对象。

而本文也给出了解决方案,即用_beginthreadex来代替。

当你这样说的时候,我想你是在暗指这个问题

但是我的函数不是__stdcall

你只需要改变你的函数来使用__stdcall调用约定。

我不知道这是否有帮助,但你可能想尝试。 我认为WaitForSingleObject只适用于Windows API。 因此,您需要使用CreateThread创建线程(您可以在API中搜索MSDN,它比beginthread稍微复杂一点,但不是太多,大多数不熟悉的结构可以设置为NULL,如果您没有进入安全性等)。 CreateThread返回一个你可以等待的句柄。

我认为beginthread返回的东西,你不能等待,也就是说,WaitForSingleObject的行为将是未定义的。 在这种情况下,它可能会永远等待,因为这个getchar不被调用。