我正在实施一个启动4个线程的程序。
功能是:
void* SOURCE_in(struct SOURCE_1*);
void* SOURCE_out(struct SOURCE*);
void* SINK_out(struct SINK_1*);
void* SINK_in(struct SINK*);
这些功能允许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 .... 但我的函数不是nunsigned __stdcall ...
的类型我构建了没有错误的程序,我使用断点来测试它,它没问题。 当我编译我有这个问题:
线程'Win32 Thread'(0x11ec)已退出,代码为0(0x0)。 线程'Win32 Thread'(0x918)已退出,代码为0(0x0)。 线程'Win32 Thread'(0x8a4)已退出,代码为0(0x0)。 线程'Win32 Thread'(0x2a8)已退出,代码为-1073741510(0xc000013a)。 线程'Win32 Thread'(0x12f8)已退出,代码为-1073741510(0xc000013a)。 程序'[3984] SW = SW.exe:Native'已退出,代码为-1073741510(0xc000013a)。
程序永远不会进入函数getchar()
在做这个程序之前,我做了一个程序,在两个块之间进行通信,一个读取,另一个写入。在那种情况下,我没有遇到任何问题。
如果我不使用WaitForSingleObject函数,问题就会消失,但我的程序几乎所有时间都会在完成之前停止。
每个线程使用的功能,中断停止。 但我希望其他人能继续下去,直到它突然爆发。
答案 0 :(得分:4)
_beginthread
的文档说明您不能使用其中一个等待函数:
以下示例代码演示了如何使用_beginthreadex返回的线程句柄和同步API WaitForSingleObject。主线程在继续之前等待第二个线程终止。当第二个线程调用_endthreadex时,它会使其线程对象进入信号状态。这允许主线程继续运行。使用_beginthread和_endthread无法做到这一点,因为_endthread调用CloseHandle,在将线程对象设置为信号状态之前销毁它。
本文还为您提供了解决方案,即改为使用_beginthreadex
。
当你说那个时,我认为你在问题中提到了这一点
但我的功能不是__stdcall
您只需更改功能即可使用__stdcall
调用约定。
答案 1 :(得分:0)
我不知道这是否有帮助,但您可能想尝试一下。我认为WaitForSingleObject只适用于Windows API。因此,你需要创建一个使用CreateThread
(你可以搜索TGE MSDN对API的线程,它是略高于beginthread更复杂但不是很多,大多数不熟悉的结构可以被设置为NULL,如果你不进安全等)。 CreateThread返回一个你可以等待的句柄。
我认为beginthread
会返回一些你不能等待的东西,也就是说,WaitForSingleObject的行为将是未定义的。在这种情况下,它可能只是永远等待,因为这个getchar没有被调用。