电话亭问题

 

 

 

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <windows.h>
#include <io.h>
#include <conio.h>
#include  <stdlib.h>
#include <fstream>
using namespace std;

#define BOY 'B'  //读者
#define GIRL 'G'  //写者
#define DELAY_TIME 700  //最基本的延迟时间,其他都为他的倍数
#define MAX_THREAD_NUM 64 //最大线程数
int boys_waiting = 0;
int girls_waiting = 0;
int usingnum = 0;
//临界区
CRITICAL_SECTION S_girls;
CRITICAL_SECTION S_boys;
//线程结构体
struct Thread{
    int serial;  //线程序号
    char entity;   //判断是男生还是女生
    double delay;   //线程延迟
    double persist; //线程写操作持续时间
};
//写者优先 读者进程
void GP_BoyThread(void *p)
{
    //互斥变量
    HANDLE h_Mutex;
    h_Mutex = OpenMutex(MUTEX_ALL_ACCESS,false,"mutex1");
    DWORD m_delay = (DWORD)(((Thread*)(p))->delay*DELAY_TIME);
    DWORD m_persist = (DWORD)(((Thread*)(p))->persist*DELAY_TIME);
    int m_serial = ((Thread*)(p))->serial;
    Sleep(m_delay);//延迟等待
    cout<<"男生线程 "<<m_serial<<" 发送进入请求"<<endl;

    WaitForSingleObject(h_Mutex,-1);//P互斥信号量

    if((usingnum==0)&&(girls_waiting==0)){
        usingnum = 1;
        ReleaseMutex(h_Mutex);//V互斥信号量
    }
    else{
        boys_waiting++;
        ReleaseMutex(h_Mutex);
        EnterCriticalSection(&S_boys);//P临界区
    }

    cout<<"男生线程 "<<m_serial<<" 使用电话。"<<endl;
    Sleep(m_persist);
    //退出线程
    cout<<"男生线程 "<<m_serial<<" 已使用完电话。"<<endl;

    WaitForSingleObject(h_Mutex,-1);
    if(girls_waiting > 0){
        girls_waiting--;
        LeaveCriticalSection(&S_girls);//V临界区
    }
    else if(boys_waiting >0){
        boys_waiting--;
        LeaveCriticalSection(&S_boys);
    }
    else usingnum = 0;
    ReleaseMutex(h_Mutex);
}
//写者优先 写者进程
void GP_GirlThread(void *p){
   //互斥变量
    HANDLE h_Mutex;
    h_Mutex = OpenMutex(MUTEX_ALL_ACCESS,false,"mutex1");
    DWORD m_delay = (DWORD)(((Thread*)(p))->delay*DELAY_TIME);
    DWORD m_persist = (DWORD)(((Thread*)(p))->persist*DELAY_TIME);
    int m_serial = ((Thread*)(p))->serial;
    Sleep(m_delay);//延迟等待
    cout<<"女生线程 "<<m_serial<<" 发送进入请求"<<endl;

    WaitForSingleObject(h_Mutex,-1);

    if(usingnum==0){
        usingnum = 1;
        ReleaseMutex(h_Mutex);
    }
    else{
        girls_waiting++;
        ReleaseMutex(h_Mutex);
        EnterCriticalSection(&S_girls);
    }

    cout<<"女生线程 "<<m_serial<<" 使用电话。"<<endl;
    Sleep(m_persist);
    //退出线程
    cout<<"女生线程 "<<m_serial<<" 已使用完电话。"<<endl;

    WaitForSingleObject(h_Mutex,-1);
    if(girls_waiting > 0){
        girls_waiting--;
        LeaveCriticalSection(&S_girls);
    }
    else if(boys_waiting >0){
        boys_waiting--;
        LeaveCriticalSection(&S_boys);
    }
    else usingnum = 0;
    ReleaseMutex(h_Mutex);
}
void WriterPriority(char *file){
    DWORD n_thread=0; //线程数目
    DWORD thread_ID;//线程ID

    //创建线程数组
    HANDLE h_Thread[MAX_THREAD_NUM];
    Thread threads[MAX_THREAD_NUM];
    //初始化计数器和临界区
    boys_waiting  = 0;
    girls_waiting = 0;
    InitializeCriticalSection(&S_boys);
    InitializeCriticalSection(&S_girls);
    //打开文件
    ifstream inFile;
    inFile.open(file);
    cout<<"程序开始:"<<endl;
    cout<<endl;
    //获取文件内容
    while(inFile){
        inFile>>threads[n_thread].serial;
        inFile>>threads[n_thread].entity;
        inFile>>threads[n_thread].delay;
        inFile>>threads[n_thread++].persist;
        inFile.get();
    }
    for(int i=0;i<(int)(n_thread);i++){
        if(threads[i].entity==BOY||threads[i].entity=='b')
        {
            //创建男孩线程
            h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(GP_BoyThread),&threads[i],0,&thread_ID);
        }
        else
            //创建女孩线程
            h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(GP_GirlThread),&threads[i],0,&thread_ID);
    }
     WaitForMultipleObjects(n_thread,h_Thread,true,-1);
    cout<<"所有的男孩和女孩都进入过电话亭。"<<endl;
}
int main(){
    int num;
    int cnt = 0;
    while(1){
        cout<<"************************************"<<endl;
        cout<<endl;
        cout<<"|             1.程序开始            |"<<endl;
        cout<<"|             2.退出程序            |"<<endl;
        cout<<endl;
        cout<<"************************************"<<endl;
start:
        cout<<"请输入你所要进行的选择:"<<endl;
        cin>>num;
        if(num<1||num>2)
        {
            cout<<"输入无效,请重新输入"<<endl;
            goto start;
        }
        else if(num==1){
            WriterPriority("thread.txt");
        }
        else if(num==2){
            exit(0);
        }

        system("pause");
        system("cls");
    }
    system("pause");
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值