Chapter 4. 멀티 스레딩

개발하는 운동인·2025년 10월 27일

멀티 스레딩

  • 메인 스레드만 사용하면 시간이 오래걸리고, 메인 스레드와 부가적인 스레드로 추가하여 병렬로 하는 것을 스레드라고 한다.
  • 메인스레드에서 1번 스레드 실행 -> 2번 스레드 실행 -> 하면 멀티 쓰레딩 구조가 된다. 하지만, 스레드는 힙 영역을 공유하게 된다.

언제 멀티 스레딩을 사용해야 되며, 왜 사용할까?

오래 걸리는 일 하나와 빨리 끝나는 일 여럿이 같이 해야 될 때

  • 로딩
  • 어떤 긴 처리를 진행하는 동안 다른 짧은 일을 처리해야 할 때
  • 기기에 있는 cpu를 모두 활용할 때

멀티 스레드 프로그래밍의 어려운점

  • 멀티 스레드는 힙 영역을 공유하게 된다. 힙 영역에 있는 것을 교차에서 접근하다면
  • 임계영역이 힘들다.

임계영역 처리

Lock 구현 , SpinLock

  • lock키워드

  • ResetEvent

  • 무한으로 스레드가 돌게되면 안되므로 컨텍스트 스위칭을 해봐야 함.

멀티 스레딩 - 임기영역 예제

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp2qwewqwe
{
    class Program
    {
        static int counter = 0; //힙 영역에 저장.
        static object lockObj = new object(); //힙 영역에 저장

        static void Main(string[] args)
        {
            Thread thread1 = new Thread(Increment); // +1 하는 스레드
            Thread thread2 = new Thread(Decrement); // -1 하는 스레드

            thread1.Start();
            thread2.Start();

            thread1.Join();
            thread2.Join();

            Console.WriteLine($"최종 counter 값: {counter}");
        }

        static void Increment()
        {
            for (int i = 0; i < 1000000; i++)
            {
                lock (lockObj) //lock의 인자는 값이 아닌 참조타입이여야 함. object
                {
                    counter++;
                }
            }
        }

        static void Decrement()
        {
            for (int i = 0; i < 1000000; i++)
            {
                lock (lockObj)
                {
                    counter--;
                }
            }
        }
    }
}

0개의 댓글