YJX基础66 多线程与临界区 重点

这篇博客通过C++实现了一个多线程程序,模拟了五个线程抢厕所的情景。每个线程随机产生尿意并等待一段时间后进入临界区(厕所),同一时间仅允许一个线程使用厕所。程序利用了CRITICAL_SECTION对象来管理临界区,确保线程安全。在完成规定的次数后,线程自动结束。

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

// 线程关键区五人抢厕所.cpp : 定义控制台应用程序的入口点。
// 5个线程进行存尿和上厕所的循环。厕所(临界区)同一时间只能一人用。

//每个线程上完5次厕所即结束本线程

#include "stdafx.h"
#include <windows.h>
#include<time.h>        //为了用time(0)当随机种子

//定义临界区对象
CRITICAL_SECTION bathroom;


DWORD WINAPI seize_bathroom(LPVOID lpParam);

int main()
{

    DWORD ThreadId;
    HANDLE hThread[5];
    //初始化临界区对象
    InitializeCriticalSection(&bathroom);
    //创建5个线程
    for (int i = 0; i<5; i++)
    {
        hThread[i] = CreateThread(NULL, NULL, seize_bathroom, LPVOID(i + 1), 0, &ThreadId);
        //创建线程时会自动运行seize_bathroom函数
        //在被调函数中 识别是哪个线程在调用函数,用的是LPVOID那个位置的参数
        //此 线程创建方法 和 函数调用方法 必须看懂

                            
        printf("第%d号线程创建成功\n", i + 1);
    }
    //等待五个线程运行结束
    WaitForMultipleObjects(5, hThread, true, INFINITE);
    //删除临界区对象
    DeleteCriticalSection(&bathroom);
    
    ::system("PAUSE");
    return 0;
}

DWORD WINAPI seize_bathroom(LPVOID lpParam)
{
    //得到 线程序号
    int n = (int)lpParam;

    int peetime = 5;        //每个线程上完5次厕所即结束

    //随机产生尿意时间 2-12秒 即2000-12000毫秒 如厕时间1秒
    srand(time(0));

    while (peetime--)
    {
        srand(time(0)*n);
        int sleeptime0 = rand() % 12000 + 2000;
        int sleeptime = sleeptime0/10;

        Sleep(sleeptime);
        printf("         %d 号线程产生了尿意 耗时%d \n", n,sleeptime0);

        EnterCriticalSection(&bathroom);    //进入临界区
        printf("%d 号线程第 %d 次进入了厕所 \n", n,(5-peetime));
        Sleep(100);

        //出临界区
        printf("  %d 号线程离开了厕所 \n\n", n);
        LeaveCriticalSection(&bathroom);
    }
    printf("第%d号线程结束运行\n", n);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值