关于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;
}

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

相关文章: