C# 심화 문법4

jiyul·2023년 11월 15일
0

C#

목록 보기
9/21
post-thumbnail

Thread

  • 하나의 프로세스(프로그램)에 여러 개의 스레드를 만들면 OS(윈도우)가 스레드의 실행 순서를 정함

멀티스레드

동시에 실행되는 것처럼 보이지만 병렬적으로 작동

using System.Threading
Thread 스레드명 = new Thread(함수명);
스레드명.Start(); // 스레드
스레드명.Join(); // 해당 스레드가 끝날때까지 대기

lock

static object lockObject = new object();
lock (lockObject)
{
	// 여기선 현재 스레드만 실행되고 다른 스레드가 실행되지 않음
}

실습 (멀티스레드 레이스)

using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;

namespace WindowsFormsApp6
{
    public partial class Form1 : Form
    {
    	//현재 몇 명이 도착했는지
        static int sharedData = 0;
        public Form1()
        {
            InitializeComponent();
            //각 차량의 스레드 생성, 파라미터를 주기 위한 코드
            Thread car1 = new Thread(new ParameterizedThreadStart(car_t));
            Thread car2 = new Thread(new ParameterizedThreadStart(car_t));
            Thread car3 = new Thread(new ParameterizedThreadStart(car_t));
            Thread car4 = new Thread(new ParameterizedThreadStart(car_t));
            Thread car5 = new Thread(new ParameterizedThreadStart(car_t));
            
            //background는 프로그램 종료 시, 스레드가 살아있지 못하게
            car1.IsBackground = true;
            car1.Start("car1");
            car2.IsBackground = true;
            car2.Start("car2");
            car3.IsBackground = true;
            car3.Start("car3");
            car4.IsBackground = true;
            car4.Start("car4");
            car5.IsBackground = true;
            car5.Start("car5");
        }

        //async는 await Task.Delay라는 비동기식 코드가 있다는 것을 의미함
        async void car_t(object name)
        {
            //랜덤 변수를 스레드마다 다르게 생성하기 위해
            Random rnd = new Random(Guid.NewGuid().GetHashCode());
            int sec = rnd.Next(1000);
            //걸린시간을 측정
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            for (int i = 0; i < 10; i++)
            {
                await Task.Delay(sec);
            }
            stopwatch.Stop();
            //몇 명이 도착했는지 알기 위해
            sharedData++;
            //출력
            textBox1.Text += $"{sharedData}등 {name} 도착, 딜레이 : {sec}, 걸린시간 : " + stopwatch.Elapsed + "\r\n";
            //모두 도착 시 레이스 종료
            if (sharedData == 5)
            {
                textBox1.Text += "레이스 종료";
            }
        }
    }
}
profile
Let's take the lead

0개의 댓글

관련 채용 정보