Csharp/CSharp Tutorial/Thread/Mutex — различия между версиями
Admin (обсуждение | вклад) м (1 версия) |
Admin (обсуждение | вклад) м (1 версия) |
(нет различий)
|
Текущая версия на 12:20, 26 мая 2010
Содержание
Name a Mutex
using System;
using System.Threading;
class MainClass {
public static void Main( string[] args ) {
string mutexName = "MainClass";
Mutex m = new Mutex( false, mutexName );
for( ;; ) {
m.WaitOne( );
Console.WriteLine("Have Mutex");
Console.WriteLine("Releasing");
m.ReleaseMutex( );
}
}
}
Have Mutex Releasing Have Mutex Releasing ... ... ^CTerminate batch job (Y/N)? n
Own a Mutex
using System;
using System.Threading;
class MainClass
{
public static void Main()
{
bool ownsMutex;
using (Mutex mutex =new Mutex(true, "MutexExample", out ownsMutex))
{
if (ownsMutex)
{
Console.WriteLine("Owned");
mutex.ReleaseMutex();
}
else
{
Console.WriteLine("Another instance of this application " +
" already owns the mutex named MutexExample.");
}
}
}
}
Owned
Threading with Mutex
using System;
using System.Collections;
using System.Threading;
class MainClass
{
public static ArrayList MyList = new ArrayList();
private static Mutex MyMutex = new Mutex(false, "MyMutex");
static void Main(string[] args)
{
Thread ThreadOne = new Thread(new ThreadStart(MutexExample));
ThreadOne.Start();
}
protected static void MutexExample()
{
MyMutex.WaitOne();
MyList.Add(" a value");
MyMutex.ReleaseMutex();
}
}
using System;
using System.Threading;
class MyCounter {
public static int count = 0;
public static Mutex MuTexLock = new Mutex();
}
class IncThread {
public Thread thrd;
public IncThread() {
thrd = new Thread(this.run);
thrd.Start();
}
void run() {
Console.WriteLine("IncThread is waiting for the mutex.");
MyCounter.MuTexLock.WaitOne();
Console.WriteLine("IncThread acquires the mutex.");
int num = 10;
do {
Thread.Sleep(50);
MyCounter.count++;
Console.WriteLine("In IncThread, MyCounter.count is " + MyCounter.count);
num--;
} while(num > 0);
Console.WriteLine("IncThread releases the mutex.");
MyCounter.MuTexLock.ReleaseMutex();
}
}
class DecThread {
public Thread thrd;
public DecThread() {
thrd = new Thread(new ThreadStart(this.run));
thrd.Start();
}
void run() {
Console.WriteLine("DecThread is waiting for the mutex.");
MyCounter.MuTexLock.WaitOne();
Console.WriteLine("DecThread acquires the mutex.");
int num = 10;
do {
Thread.Sleep(50);
MyCounter.count--;
Console.WriteLine("In DecThread, MyCounter.count is " + MyCounter.count);
num--;
} while(num > 0);
Console.WriteLine("DecThread releases the mutex.");
MyCounter.MuTexLock.ReleaseMutex();
}
}
class MainClass {
public static void Main() {
IncThread mt1 = new IncThread();
DecThread mt2 = new DecThread();
mt1.thrd.Join();
mt2.thrd.Join();
}
}
IncThread is waiting for the mutex. IncThread acquires the mutex. DecThread is waiting for the mutex. In IncThread, MyCounter.count is 1 In IncThread, MyCounter.count is 2 In IncThread, MyCounter.count is 3 In IncThread, MyCounter.count is 4 In IncThread, MyCounter.count is 5 In IncThread, MyCounter.count is 6 In IncThread, MyCounter.count is 7 In IncThread, MyCounter.count is 8 In IncThread, MyCounter.count is 9 In IncThread, MyCounter.count is 10 IncThread releases the mutex. DecThread acquires the mutex. In DecThread, MyCounter.count is 9 In DecThread, MyCounter.count is 8 In DecThread, MyCounter.count is 7 In DecThread, MyCounter.count is 6 In DecThread, MyCounter.count is 5 In DecThread, MyCounter.count is 4 In DecThread, MyCounter.count is 3 In DecThread, MyCounter.count is 2 In DecThread, MyCounter.count is 1 In DecThread, MyCounter.count is 0 DecThread releases the mutex.
Use the Mutex object: WaitOne
using System;
using System.Threading;
class MainClass
{
private static int Runs = 0;
static Mutex mtx = new Mutex(false, "RunsMutex");
public static void CountUp()
{
while (Runs < 10)
{
// acquire the mutex
mtx.WaitOne();
int Temp = Runs;
Temp++;
Console.WriteLine(Thread.CurrentThread.Name + " " + Temp);
Thread.Sleep(1000);
Runs = Temp;
// release the mutex
mtx.ReleaseMutex();
}
}
public static void Main()
{
Thread t2 = new Thread(new ThreadStart(CountUp));
t2.Name = "t2";
Thread t3 = new Thread(new ThreadStart(CountUp));
t3.Name = "t3";
t2.Start();
t3.Start();
}
}
t2 1 t3 2 t3 3 t3 4 t3 5 t3 6 t3 7 t3 8 t3 9 t3 10 t2 11