using System;
using System.Threading ;
public class Test
{
static void Main( )
{
new Train( true ) ;
new Train( true ) ;
Thread.Sleep ( 100 ) ;
new Train( false ) ;
new Train( true ) ;
new Train( false ) ;
Console.Read ( ) ;
}
}
class Railway
{
public static Semaphore lock1 = new Semaphore( 1 , 1 ) ;
}
class Train
{
static Semaphore w_turnstile = new Semaphore( 1 , 1 ) ;
static Semaphore w_mutex = new Semaphore( 1 , 1 ) ;
static int w_counter = 0 ;
static Semaphore e_turnstile = new Semaphore( 1 , 1 ) ;
static Semaphore e_mutex = new Semaphore( 1 , 1 ) ;
static int e_counter = 0 ;
bool West;
public Thread Thrd;
public Train( bool west)
{
West = west;
Thrd = new Thread( this.Run ) ;
Thrd.Name = west ? "запад" : "восток" ;
Thrd.Start ( ) ;
}
private Semaphore turnstile { get { return West ? w_turnstile : e_turnstile; } }
private Semaphore turnstile2 { get { return West ? e_turnstile : w_turnstile; } }
private Semaphore mutex { get { return West ? w_mutex : e_mutex; } }
private int counter { get { return West ? w_counter : e_counter; } }
private void Inc( )
{
if ( West) w_counter++; else e_counter++;
}
private void Dec( )
{
if ( West) w_counter--; else e_counter--;
}
void Run( )
{
Console.WriteLine ( "- Подошёл поезд на {0}" , Thrd.Name ) ;
turnstile.WaitOne ( ) ;
turnstile.Release ( ) ;
mutex.WaitOne ( ) ;
Inc( ) ;
if ( counter == 1 )
{
turnstile2.WaitOne ( ) ;
Railway.lock1 .WaitOne ( ) ;
Console.WriteLine ( "! Стрелка на {0}" , Thrd.Name ) ;
turnstile2.Release ( ) ;
}
mutex.Release ( ) ;
//движение поезда
Console.WriteLine ( "( Едет поезд на {0} ({1})" , Thrd.Name , counter) ;
Thread.Sleep ( 1000 ) ;
mutex.WaitOne ( ) ;
Dec( ) ;
if ( counter == 0 )
{
Railway.lock1 .Release ( ) ;
}
mutex.Release ( ) ;
Console.WriteLine ( ") Проехал поезд на {0} ({1})" , Thrd.Name , counter) ;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwoKcHVibGljIGNsYXNzIFRlc3QKewoJc3RhdGljIHZvaWQgTWFpbigpCgl7CgkgICAgbmV3IFRyYWluKHRydWUpOwoJICAgIG5ldyBUcmFpbih0cnVlKTsKCSAgICBUaHJlYWQuU2xlZXAoMTAwKTsKCSAgICBuZXcgVHJhaW4oZmFsc2UpOwoJICAgIG5ldyBUcmFpbih0cnVlKTsKCSAgICBuZXcgVHJhaW4oZmFsc2UpOwoJICAgIENvbnNvbGUuUmVhZCgpOwoJfQp9CgpjbGFzcyBSYWlsd2F5CnsKICAgIHB1YmxpYyBzdGF0aWMgU2VtYXBob3JlIGxvY2sxID0gbmV3IFNlbWFwaG9yZSgxLCAxKTsKfQogCmNsYXNzIFRyYWluCnsKICAgIHN0YXRpYyBTZW1hcGhvcmUgd190dXJuc3RpbGUgPSBuZXcgU2VtYXBob3JlKDEsIDEpOwogICAgc3RhdGljIFNlbWFwaG9yZSB3X211dGV4ID0gbmV3IFNlbWFwaG9yZSgxLCAxKTsKICAgIHN0YXRpYyBpbnQgd19jb3VudGVyID0gMDsKICAgIHN0YXRpYyBTZW1hcGhvcmUgZV90dXJuc3RpbGUgPSBuZXcgU2VtYXBob3JlKDEsIDEpOwogICAgc3RhdGljIFNlbWFwaG9yZSBlX211dGV4ID0gbmV3IFNlbWFwaG9yZSgxLCAxKTsKICAgIHN0YXRpYyBpbnQgZV9jb3VudGVyID0gMDsKIAogICAgYm9vbCBXZXN0OwogICAgcHVibGljIFRocmVhZCBUaHJkOwogICAgCiAgICBwdWJsaWMgVHJhaW4oYm9vbCB3ZXN0KQogICAgewogICAgICAgIFdlc3QgPSB3ZXN0OwogICAgICAgIFRocmQgPSBuZXcgVGhyZWFkKHRoaXMuUnVuKTsKICAgICAgICBUaHJkLk5hbWUgPSB3ZXN0ID8gItC30LDQv9Cw0LQiIDogItCy0L7RgdGC0L7QuiI7CiAgICAgICAgVGhyZC5TdGFydCgpOwogICAgfQogICAgCiAgICBwcml2YXRlIFNlbWFwaG9yZSB0dXJuc3RpbGUgeyBnZXQgeyByZXR1cm4gV2VzdCA/IHdfdHVybnN0aWxlIDogZV90dXJuc3RpbGU7IH0gfQogICAgcHJpdmF0ZSBTZW1hcGhvcmUgdHVybnN0aWxlMiB7IGdldCB7IHJldHVybiBXZXN0ID8gZV90dXJuc3RpbGUgOiB3X3R1cm5zdGlsZTsgfSB9CiAgICBwcml2YXRlIFNlbWFwaG9yZSBtdXRleCB7IGdldCB7IHJldHVybiBXZXN0ID8gd19tdXRleCA6IGVfbXV0ZXg7IH0gfQogICAgcHJpdmF0ZSBpbnQgY291bnRlciB7IGdldCB7IHJldHVybiBXZXN0ID8gd19jb3VudGVyIDogZV9jb3VudGVyOyB9IH0KICAgIAogICAgcHJpdmF0ZSB2b2lkIEluYygpCiAgICB7CiAgICAgICAgaWYoV2VzdCkgd19jb3VudGVyKys7IGVsc2UgZV9jb3VudGVyKys7CiAgICB9CiAgICAKICAgIHByaXZhdGUgdm9pZCBEZWMoKQogICAgewogICAgICAgIGlmKFdlc3QpIHdfY291bnRlci0tOyBlbHNlIGVfY291bnRlci0tOwogICAgfQogICAgCiAgICAKICAgIHZvaWQgUnVuKCkKICAgIHsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiLSDQn9C+0LTQvtGI0ZHQuyDQv9C+0LXQt9C0INC90LAgezB9IiwgVGhyZC5OYW1lKTsKICAgIAogICAgICAgIHR1cm5zdGlsZS5XYWl0T25lKCk7CiAgICAgICAgdHVybnN0aWxlLlJlbGVhc2UoKTsKICAgICAKICAgICAgICBtdXRleC5XYWl0T25lKCk7CiAgICAgICAgSW5jKCk7CiAgICAgICAgaWYoY291bnRlciA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgdHVybnN0aWxlMi5XYWl0T25lKCk7CiAgICAgICAgICAgIFJhaWx3YXkubG9jazEuV2FpdE9uZSgpOwogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiISDQodGC0YDQtdC70LrQsCDQvdCwIHswfSIsIFRocmQuTmFtZSk7CiAgICAgICAgICAgIHR1cm5zdGlsZTIuUmVsZWFzZSgpOwogICAgICAgIH0KICAgICAgICBtdXRleC5SZWxlYXNlKCk7CiAKICAgICAgICAvL9C00LLQuNC20LXQvdC40LUg0L/QvtC10LfQtNCwCiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIigg0JXQtNC10YIg0L/QvtC10LfQtCDQvdCwIHswfSAoezF9KSIsIFRocmQuTmFtZSwgY291bnRlcik7CiAgICAgICAgVGhyZWFkLlNsZWVwKDEwMDApOwogCiAgICAgICAgbXV0ZXguV2FpdE9uZSgpOwogICAgICAgIERlYygpOwogICAgICAgIGlmKGNvdW50ZXIgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIFJhaWx3YXkubG9jazEuUmVsZWFzZSgpOwogICAgICAgIH0KICAgICAgICBtdXRleC5SZWxlYXNlKCk7ICAgIAogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIpINCf0YDQvtC10YXQsNC7INC/0L7QtdC30LQg0L3QsCB7MH0gICh7MX0pIiwgVGhyZC5OYW1lLCBjb3VudGVyKTsKICAgIH0KfQ==