상세 컨텐츠

본문 제목

[C#] Thread 기본

코딩하는코알라/C#

by 룰루랄라코알라 2023. 7. 24. 08:51

본문

Thread : 병행작업, 오래걸리는 작업, 네트워크송수신, DB작업 등 
동시에 실행을 시킬때 병행적으로 같이 진행할수있다.

Load 안에 Thread 를 실행 시키면 Application.Run(new Form1())  -> LOAD - > Thread 순 진행 

 

TIP : 입계영역이란 ?
공유리소스(Ex 전역 함수)에 Thread Safety 하게 접근하는 영역

C# 에서는 lock()키워드를 사용 

// microsoft 가이드 참조
lock 문은 지정된 개체에 대한 상호 배제 잠금을 획득하여 명령문 블록을 실행한 다음, 잠금을 해제합니다. 잠금이 유지되는 동안 잠금을 보유하는 스레드는 잠금을 다시 획득하고 해제할 수 있습니다. 다른 스레드는 잠금을 획득할 수 없도록 차단되며 잠금이 해제될 때까지 대기합니다.


lock() 를 사용 하여 상호배재 잠금 진행 키워드 안에 원하는 Thread 공통변수를 사용하면 된다. 
lock()키워드에 빠져나오면 상호배재가 해제가 되어 따로 해제를 하지 않아도 된다.


-- 주로 파일 읽고쓰기,네트워크전송수신,DB작업등등 사용 


AutoResetEvent 이벤트
병렬로 Thread 작업이 가능하게 할경우 또는 여러개의Thread가 영향받지 않기 위해 자주 사용
AutoResetEvent autoResetEt = new AutoResetEvent(true);
autoResetEt.WaitOne();//신호를 받을 때 까지 대기하게됩니다.//생성자에 True 를 주면 첫번쨰신호는 받은상태로변경//두번쨰신호를 대기하는 상태.
autoResetEt.Set();// 신호를 보내기   

 

Thread thread1 = null;
Thread thread2 = null;

AutoResetEvent autoResetEvent = new AutoResetEvent(true);

private void Form1_Load(object sender, EventArgs e)
{
  try{
		thread = new Thread(new ThreadStart(실행시킬 void));

		thread.IsBackground = true;//UIThread가 종료될때 저희가만든 해당 쓰레드도종료가.
		thread.Priority = ThreadPriority.Normal;//OS(운영체제)자원을 얼마나 자주사용.
		thread.Start();

        thread2 = new Thread(new ThreadStart(Work2));
        thread2.IsBackground = true;//UIThread가 종료될때 저희가만든 해당 쓰레드도종료가.
        thread2.Priority = ThreadPriority.Normal;//OS(운영체제)자원을 얼마나 자주사용.
        thread2.Start();
	}
	catch (Exception ex)
    {

    }
}

 /// <summary>
        /// thread가 사용할 함수.
        /// </summary>
        private void WorkThread()
        {
            while (true)//반복문
            {
                //1번째로 신호를 받기위해서 기다리는상태.
                autoResetEvent.WaitOne();//신호를 받을 때 까지 대기하게됩니다.//생성자에 true 를 주면 첫번쨰신호는 받은상태로변경//두번쨰신호를 대기하는 상태.

                //다음작업을 하기를 원하면
                MessageBox.Show("" + a);
            }
        }
        
        private void Work2()
        {
            //lock (lockObj)
            //{
            //    a = 4;
            //    Thread.Sleep(5000);

            //    MessageBox.Show("" + a);
            //}
            while (true)//반복문
            {
                a++;
                Thread.Sleep(5000);//5초를기다
                autoResetEvent.Set();//2번쨰 신호를 보내  
            }
        }
반응형

관련글 더보기