我正在执行一个启动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不被调用。