c#.net

c#.net 공유자원 테스트

우유빛 2010. 6. 2. 00:16


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();
            }
        }
    }
}