计算机操作系统感悟随笔--实例思考

关于C++多线程实例
引用自https://www.cnblogs.com/codingmengmeng/p/5913068.html的C++多线程入门实例
首先是最初实例代码:

#include <iostream>
#include <windows.h>
using namespace std;

DWORD WINAPI Fun(LPVOID lpParamter)    //自定义线程
{
    for (int i = 0; i < 10; i++)   //定义执行次数
        cout << "A Thread Fun Display!" << endl;   //定义输出内容
    return 0L;
}

int main()    //主线程
{
    HANDLE hThread = CreateThread(NULL, 0, Fun, NULL, 0, NULL);
    CloseHandle(hThread);
    for (int i = 0; i < 10; i++)    //执行次数
        cout << "Main Thread Display!" << endl;
    return 0;
}

运行结果如下:
在这里插入图片描述

在这里插入图片描述从代码运行结果来看,主线程(main函数)和我们自己的线程(Fun函数)是随机交替执行的,同时从第二次运行结果会发现一个问题,即"A Thread Fun Display!"并没有输出达到十次,也就是说我们自定义的函数并没有执行足够的次数。这是因为主线程运行完之后将所占资源都释放掉了,使得子线程还没有运行完。
同时,我们会发现一个现象,即在输出结果上,换行操作执行的很凌乱没规律,理论上讲应该是一次输出一次换行,然而这里出现了不换行和连续换行的现象。
用我们学过的知识可以来解释:把屏幕看成是一个资源,这个资源被两个线程所共用,加入当Fun函数输出了Fun Display!后,将要输出endl,但此时,main函数却得到了运行的机会,此时Fun函数还没有来得及输出换行(时间片用完),就把CPU让给了main函数,而这时main函数就直接在Fun Display!后输出Main Display!。
另一种情况就是“输出两个换行”,这种情况就是比如输出Main Display!并输出endl后,时间片用完,轮到子线程占用CPU,子进程上一次时间片用完时停在了Fun Display!,下一次时间片过来时,刚好开始输出endl,此时就会“输出两个换行”。
那么,想要实现正常的输出情况,就可以用互斥来解决。
实例代码2:

#include <iostream>
#include <windows.h>
using namespace std;

HANDLE hMutex = NULL;          //互斥信号量
DWORD WINAPI Fun(LPVOID lpParamter)      //线程函数
{
    for (int i = 0; i < 10; i++)     //定义输出次数
    {
          //请求一个互斥信号量
        WaitForSingleObject(hMutex, INFINITE);
        cout << "A Thread Fun Display!" << endl;
        Sleep(100);
        //释放互斥量锁
        ReleaseMutex(hMutex);
    }
    return 0L;//表示返回的是long型的0

}

int main()
{
    //创建一个子线程
    HANDLE hThread = CreateThread(NULL, 0, Fun, NULL, 0, NULL);
    hMutex = CreateMutex(NULL, FALSE,"screen");
    //关闭线程
    CloseHandle(hThread);
    //主线程的执行路径
    for (int i = 0; i < 10; i++)
    {
        //请求获得一个互斥信号量
        WaitForSingleObject(hMutex,INFINITE);
        cout << "Main Thread Display!" << endl;
        Sleep(100);
        //释放互斥信号量
        ReleaseMutex(hMutex);
    }
    return 0;
}

代码实现:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值