#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);
//
}