c++实现子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次

准确的说这是在别人代码上修改的,虽说这种实现方法可以实现题意。但是总感觉还有更好的方法,如果读者有更好的方法欢迎留言,如果读完本文有所收获也可以留言,大家一起分享。

#include <stdio.h>  
#include <process.h>  
#include <windows.h>  

HANDLE   g_hThreadEvent1;
HANDLE   g_hThreadEvent2;

int g_nMainLoopNum = 0;
int g_nSubLoopNum = 0;


#define  LOOPNUM   50
#define  MAINLOOPNUM   100
#define  SUBLOOPNUM  10


unsigned int __stdcall subThreadFun(void* pData)
{
    while (1)                                                                                   //子线程要一直监听信号量?
    {
        WaitForSingleObject(g_hThreadEvent2, INFINITE);                                         //等待事件2的信号量,期间不往下执行     P(event2)

        g_nSubLoopNum++;                                                                        //子线程执行次数
        for (int i = 1; i <= SUBLOOPNUM; i++)
        {
            printf("子线程编号是 %d ,在循环第 %d 次\n", GetCurrentThreadId(), i);          
        }

        printf("************子线程正在执行第%d次**************\n\n", g_nSubLoopNum);         
        ReleaseSemaphore(g_hThreadEvent1, 1, NULL);                                             //设置事件1的信号量,相当于执行主线程   v(event1)

        Sleep(100);
    }
    return  0;
}

int main()
{
    g_hThreadEvent1 =  CreateSemaphore(NULL, 0, 1, NULL);
    g_hThreadEvent2 =  CreateSemaphore(NULL, 1, 1, NULL);
    _beginthreadex(NULL, 0, subThreadFun, NULL, 0, NULL);                                       //创建子线程

    //相当于main为主线程
    for (int i = 1; i <= LOOPNUM; ++i)
    {
        WaitForSingleObject(g_hThreadEvent1, INFINITE);                                         //一直等待线程事件1的信号量             p(event1)

        g_nMainLoopNum++;                                                                       //主线程执行次数
        for (int num = 1; num <= MAINLOOPNUM; num++)
        {
            printf("主线程编号是 %d ,在循环第 %d 次\n", GetCurrentThreadId(), num );
        }
        printf("************主线程正在执行第%d次**************\n\n", g_nMainLoopNum);

        Sleep(100);

        if (i != LOOPNUM)
        {
            ReleaseSemaphore(g_hThreadEvent2, 1, NULL);                                         //给事件2设置信号量,就是让子线程执行   v(event2)
        }
        else
            break;
    }

    CloseHandle(g_hThreadEvent1);
    CloseHandle(g_hThreadEvent2);
    return 0;
}

原博客地址:http://blog.csdn.net/morewindows/article/details/7392749#cpp

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值