- #include<windows.h>
- #include<iostream.h>
- #include<stdio.h>
- void gotoxy(int x,int y)
- {
- COORD c;
- c.X=x;
- c.Y=y;
- SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
- }
- /*四个信号量,东,西方向信号量,东,西段互斥信号量,用信号量控制过桥的对象,同时过桥的对象仅且
- 只有两个,并且不能同向,多个线程用同一个线程入口函数*/
- HANDLE hE_Dir; //从西往东信号量
- HANDLE hW_Dir; //从西往东信号量
- HANDLE hE_Mutex; //西段线程间的互斥
- HANDLE hW_Mutex; //东段线程互斥
- DWORD WINAPI EtoW1_Proc(LPVOID lpParameter);//东到西边线程
- DWORD WINAPI WtoE1_Proc(LPVOID lpParameter);//西到东边线程
- void bridge(); //创建过桥函数
- int i;
- int j;
- int time1=100,time2=300;
- BOOL E_Release;
- BOOL W_Release;
- int main()
- {
- bridge(); //桥型
- gotoxy(12,12); //光标第一次到(12,12)
- //各个互斥信号量
- hE_Dir = CreateMutex(NULL,FALSE,NULL);
- hW_Dir = CreateMutex(NULL,FALSE,NULL);
- hE_Mutex = CreateMutex(NULL,FALSE,NULL);
- hW_Mutex = CreateMutex(NULL,FALSE,NULL);
- //线程创建
- HANDLE hThread1,hThread2;
- hThread1=CreateThread(NULL,0,WtoE1_Proc,NULL,0,NULL);
- hThread2=CreateThread(NULL,0,EtoW1_Proc,NULL,0,NULL);
- CloseHandle(hThread1);
- CloseHandle(hThread2);
- Sleep(200000); //主线程沉睡200秒
- return 0;
- }
- //西到东边线程
- DWORD WINAPI WtoE1_Proc(LPVOID lpParameter)
- {
- while(TRUE)
- {
- WaitForSingleObject(hE_Dir,INFINITE); //从西到东互斥
- WaitForSingleObject(hE_Mutex,INFINITE); //进入西段,互斥
- gotoxy(12,12);
- for(i=14;i<=34;i++)
- {
- gotoxy(i,12);
- time1=(time1+180)%500; //随机速度
- Sleep(time1);
- gotoxy(i,12);//切换线程后,回到原地
- printf("☆");
- //gotoxy(i,12);
- }
- W_Release = ReleaseMutex(hE_Mutex); //离开西段
- if(W_Release)/*判断谁先到,先到等1秒钟*/ Sleep(1000); //到中间区域休息,等待另一方到来
- gotoxy(i,12);
- printf(" ");
- gotoxy(34,11);
- printf("☆");
- Sleep(100);
- gotoxy(34,11);
- printf("");
- gotoxy(35,11);
- printf("☆");
- Sleep(100);
- gotoxy(35,11);
- printf(" ");
- WaitForSingleObject(hW_Mutex,INFINITE); //进入东段,互斥
- for(i=35;i<=56;i++)
- {
- gotoxy(i,12);
- Sleep(90);
- gotoxy(i,12);
- printf("☆");
- gotoxy(i,12);
- }
- gotoxy(i,12);
- printf(" ");
- ReleaseMutex(hW_Mutex); //解开东段互斥
- //ReleaseMutex(hE_Mutex);
- }
- // return 0;
- }
- //东到西边线程
- DWORD WINAPI EtoW1_Proc(LPVOID lpParameter)
- {
- while(TRUE)
- {
- WaitForSingleObject(hW_Dir,INFINITE); //从东到西互斥
- WaitForSingleObject(hW_Mutex,INFINITE); //进东段 ,互斥
- gotoxy(56,12);
- for(j=54;j>=36;j--)
- {
- gotoxy(j,12);
- time2=(time2+80)%500;
- Sleep(time2);
- gotoxy(j,12); //切换线程后,回到原地
- printf("★");
- gotoxy(j,12);
- }
- E_Release = ReleaseMutex(hW_Mutex); //离开东段,
- if(E_Release) Sleep(1000);
- gotoxy(j+1,12);
- printf(" ");
- gotoxy(36,13);
- printf("★");
- Sleep(100);
- gotoxy(36,13);
- printf("");
- gotoxy(35,13);
- printf("★");
- Sleep(100);
- gotoxy(35,13);
- printf(" ");
- gotoxy(34,13);
- printf("★");
- Sleep(100);
- gotoxy(34,13);
- printf(" ");
- WaitForSingleObject(hE_Mutex,INFINITE);//进入西段,互斥
- for(j=32;j>=12;j--)
- {
- gotoxy(j,12);
- Sleep(100);
- gotoxy(j,12);
- printf("★");
- }
- gotoxy(j+1,12);
- printf(" ");
- ReleaseMutex(hE_Mutex);//离开西段段
- }
- return 0;
- }
- void bridge()
- {
- //☆ █ ★ //
- ///创建小桥//
- gotoxy(20+10,8); //8行30列
- printf("█████");
- gotoxy(20+10,9); //9行30列
- printf("█ █");
- gotoxy(20+10,10); //10行30列
- printf("█ █");
- gotoxy(4+10,11); //11行14列
- printf("█████████ █████████");
- gotoxy(4+10,13); //13行14列
- printf("█████████ █████████");
- gotoxy(20+10,14); //14行30列
- printf("█ █");
- gotoxy(20+10,15); //15行30列
- printf("█ █");
- gotoxy(20+10,16); //16行30列
- printf("█████");
- //gotoxy(56,12); //右边起始点
- //printf("★");
- //gotoxy(13,12); //左边起始点
- //printf("☆");
- // 右边中间 gotoxy(38,12);
- // 左边中间 gotoxy(30,12);
- //
- }