编程范式 18 冰淇淋商店

本文介绍了一个使用多线程技术模拟冰淇淋店运作过程的程序案例。案例中包括经理、店员、顾客及收银员四种角色,通过信号量协调各角色间的交互,确保资源的有效分配和使用。

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

clerks
40 cones
10 customers 每人吃1-4个冰淇淋 FIFO
manager不同意要重做 同时只能有一个clerk和manager见面
cashier
需要四类线程

  1. manager
  2. clerks
  3. customers
  4. cashier
int main()
{
    int totalCones=0;
    InitThreadPackage();
    SetupSemaphores();
    for(int i=0;i<10;i++)
    {
        int numCones=RandomInteger(1,1);
        ThreadNew(,Customer,1,numCunstomers);
        totalCones+=numCones;
    }
    ThreadNew(,Cashier,0);
    ThreadNew(,Manager,1,totalCones);
    RunAllThreads();
    FreeSemaphores();
    return 0;
} 
struct inspection{
    bool passed;//false
    Semaphore requested;//0
    Semaphore finished;//0
    Semphore lock;//1
}
void Manager(int totalConesNeeded)
{
    int numApproved=0;
    int numInsected=0;
    while(numApproved<totalConesNeeded)
    {
        sw(inspection<requested);
        numINspected++;
        inspection.passed=Random(1,0)
        //50%概率通过
        if(inspection.passed)
        {
            numApproved++;
        }
        ss(inspected.finished);
    }
}
void clerk(Semaphore semaToSignal)
{
    bool passed=false;
    while(!passed)
    {
        MakeCone();
        sw(inspection.lock);//semaphore wait
        ss(inspection.requested);//semaphore signal
        sw(inspection.finished);
        passed=inspection.passed;
        ss(inspection.lock);
    }
    ss(semaToSignal);
}
void Customer(int numCones)
{
    Brow X();//等店员做完
    Samphore clerkDone;
    for(int i=0;i<numCones;i++)
    {
        TN(,1,clerkDone);//ThreadNew
    }
    for(int i=0;i<numCones;i++)
    {
        sw(clerksDone);
    }
    SemaphoreFree(clerksDone);
    WalkToCashier();
    ss(line.requested);
    sw(line.lock);
    int place=line.number++;
    ss(line.lock);
    ss(line.requested);
    sw(line.customers[place]);
}   
struct line{
    int number;//0
    Semaphore requested;//0
    Semaphore Customers[10];
    Semaphore lock;//1
}
void Cashier()
{
    for(int i=0;i<10;i++)
    {
        sw(line.requested);
        checkout(i);
        semaphore line(customers[i]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值