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

本文介绍了一个使用Windows API进行线程间通信的例子。通过Semaphore和CreateSemaphore等API实现了主线程与子线程之间的信号传递,展示了如何利用信号量来协调两个线程的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#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.youkuaiyun.com/morewindows/article/details/7392749#cpp

### 回答1: 要销毁一个运行着while循环子线程,可以通过以下几个步骤来完成。 首先,需要在子线程的while循环中设置一个标识变量,用来控制循环的终止条件。可以使用一个布尔类型的变量,初始值为True。当需要销毁子线程时,将该标识变量设为False,以终止while循环。 接下来,可以在主线程中通过某种方法来通知子线程停止运行,比如使用Thread.join()方法。join()方法会等待子线程结束后再继续执行主线程。通过调用子线程对象的join()方法,可以将主线程阻塞,直到子线程运行结束。 在子线程的while循环内部,可以通过检查标识变量的值来确定是否继续循环。如果标识变量的值为False,则可以通过使用break语句来跳出while循环,从而终止子线程的执行。接着,可以进行一些清理工作,释放资源等。 最后,可以结束子线程的执行。在子线程的while循环外部,可以使用return语句来结束线程函数的执行。一旦线程函数执行结束,子线程也将随之结束。 需要注意的是,在销毁子线程时,应确保主线程子线程之间的数据同步和资源释放的正确性,以避免可能引发的问题。 ### 回答2: C子线程是一个通过while循环不断执行特定任务的线程。要销毁C子线程,有以下几种方法: 1. 退出循环:在while循环中加入一个停止条件,当达到条件时跳出循环,即可实现线程的停止。例如,在循环中使用一个布尔变量控制循环的执行,当需要停止线程时将该变量设置为false,循环会在下一迭代结束后停止。 2. 使用标志位:使用一个标志位来标记线程是否应该继续执行。在主线程中设置标志位为false,并通知子线程结束。子线程在每循环开始时检查标志位的值,如果标志位为false则退出循环实现线程的停止。 3. 中断线程:通过调用子线程的interrupt()方法,可以中断当前线程的执行。在while循环中捕获InterruptedException异常,如果捕获到该异常则退出循环实现线程的停止。需要注意的是,捕获InterruptedException异常后需要重新设置线程的中断状态。 总之,无论是使用条件控制、标志位还是中断线程的方式,都可以实现C子线程的停止。具体使用哪种方式取决于线程的实际需求和执行逻辑。 ### 回答3: 子线程是在主线程中创建和启动的,并且它是独立运行的线程。当子线程执行完其任务之后,它会自动销毁。然而,如果子线程是一个while循环,无法自动结束,则需要手动销毁。 有以下几种方式可以销毁一个在while循环中的子线程: 1. 增加一个条件变量:在while循环中增加一个条件判断,当满足某个条件时,跳出循环,结束子线程的执行。 2. 使用线程间通信机制:通过线程间的通信机制,例如消息队列或事件等方式,向子线程发送一个特定的消息或事件,让子线程在接收到该消息或事件后结束循环。 3. 使用标志位:在子线程的while循环中设置一个标志位,通过修改该标志位的值来控制子线程的结束。例如,可以定义一个全局变量或者使用AtomicBoolean类型的变量作为标志位,在主线程中改变标志位的值,子线程通过检查标志位的值来判断是否继续执行循环。 无论使用哪种方式,都需要保证线程安全性。在修改条件变量、标志位或进行线程间通信时,需要使用适当的同步机制,如synchronized关键字、锁或信号量等,以避免多线程并发访问的问题。此外,当子线程不再需要时,应该正确地终止它,避免资源占用和内存泄漏等问题的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值