首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >_beginthread和WaitForSingleObject

_beginthread和WaitForSingleObject
EN

Stack Overflow用户
提问于 2012-05-04 19:38:50
回答 2查看 5.5K关注 0票数 3

我正在实施一个程序,启动4个线程。

这些函数包括:

代码语言:javascript
复制
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中

代码语言:javascript
复制
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;}

我读到_beginthread不支持WaitForSingleObject函数...但我的函数不是nunsigned __stdcall类型...

我构建了一个没有错误的程序,并且我使用断点来测试它,它是好的。当我编译时,我遇到了这个问题:

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

程序永远不会访问getchar()函数

在做这个程序之前,我编写了一个程序,在两个块之间进行通信,一个是读,另一个是写。在这种情况下,我没有问题。

如果我不使用函数WaitForSingleObject,问题就会消失,但我的程序几乎所有时候都会在结束之前停止。

每个线程使用的函数都会在中断后停止。但我想让其他的继续下去直到它破灭..

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-04 20:04:29

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

以下示例代码演示了如何通过同步接口WaitForSingleObject使用由_beginthreadex返回的线程句柄。主线程会等待第二个线程终止,然后再继续。当第二个线程调用_endthreadex时,它会使其线程对象进入信号状态。这允许主线程继续运行。使用_beginthread和_endthread不能做到这一点,因为_endthread调用CloseHandle,在线程对象可以设置为signaled状态之前销毁它。

本文还给出了解决方案,即改用_beginthreadex

我认为你在问题中暗示了这一点。

,但我的函数不是__stdcall

您只需更改函数即可使用__stdcall调用约定。

票数 5
EN

Stack Overflow用户

发布于 2012-05-04 20:03:27

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10448121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档