using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
MutexTest m = new MutexTest();
m.start();
}
}
// lock 키워드는 하나의 함수 스레드에서 먼저 점유 및 while루프 시 비선점 하지 않음
// lock 키워드는 간헐적으로 일어나는 공유자원에 적절
class LockTest
{
int sharedVar = 0;
private object thisLock = new object();
public void start()
{
Thread one, two, prt;
one = new Thread(new ThreadStart(add));
two = new Thread(new ThreadStart(sub));
prt = new Thread(new ThreadStart(print));
two.Start();
one.Start();
prt.Start();
}
void add()
{
lock (thisLock)
{
while (true)
{
sharedVar++;
}
}
}
void sub()
{
lock (thisLock)
{
while (true)
{
sharedVar--;
}
}
}
void print()
{
lock (thisLock)
{
while (true)
{
Console.WriteLine(sharedVar);
}
}
}
}
// 전역 뮤텍스
// - 또는 + 로 약간 치우치나 적절히 동작
class MutexTest
{
int sharedVar1 = 0;
int sharedVar2 = 0;
Mutex mMutex = new Mutex();
public void start()
{
Thread one, two, prt;
one = new Thread(new ThreadStart(add));
two = new Thread(new ThreadStart(sub));
prt = new Thread(new ThreadStart(print));
two.Start();
one.Start();
prt.Start();
}
void add()
{
while (true)
{
mMutex.WaitOne();
sharedVar1++;
mMutex.ReleaseMutex();
}
}
void sub()
{
while (true)
{
mMutex.WaitOne();
sharedVar2++;
mMutex.ReleaseMutex();
}
}
void print()
{
while (true)
{
mMutex.WaitOne();
Console.WriteLine(sharedVar1 + " " + sharedVar2);
mMutex.ReleaseMutex();
}
}
}
// 각각의 함수단위의 뮤텍스 사용
// 결과 : 특정 함수에서 점유 높음
class LocalMutexTest
{
int sharedVar = 0;
int count = 0;
public void start()
{
Thread one, two, prt;
one = new Thread(new ThreadStart(add));
two = new Thread(new ThreadStart(sub));
prt = new Thread(new ThreadStart(print));
two.Start();
one.Start();
prt.Start();
}
void add()
{
Mutex mMutex = new Mutex();
while (true)
{
mMutex.WaitOne();
sharedVar++;
mMutex.ReleaseMutex();
}
}
void sub()
{
Mutex mMutex = new Mutex();
while (true)
{
mMutex.WaitOne();
sharedVar--;
mMutex.ReleaseMutex();
}
}
void print()
{
Mutex mMutex = new Mutex();
while (true)
{
mMutex.WaitOne();
Console.WriteLine(sharedVar + " " + count++);
mMutex.ReleaseMutex();
}
}
}
}