그린티라떼
개발공간
그린티라떼
전체 방문자
오늘
어제
  • 분류 전체보기 (26)
    • unity (6)
      • 개발 (4)
      • iTween (0)
      • error (2)
    • 게임서버 (5)
    • C++ (7)
      • 문법 (5)
      • 알고리즘 (2)
    • C# (5)
    • CS지식 (1)
    • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Functions
  • Gradle build failed
  • delegate chain
  • var
  • 일반화
  • 제네릭
  • interface
  • inline 함수
  • C++
  • cs지식
  • 메모리영역
  • 형식매개변수의 제약
  • object
  • 일반화컬렉션
  • Delegate
  • c#
  • 함수 호출 오버헤드
  • 함수호출
  • Container
  • unity
  • 정규 표현식
  • Dynamic
  • 유니티 빌드 에러
  • cout 스트림 버퍼
  • 데이터타입
  • 다중상속의 문제점
  • regex
  • 컨테이너
  • property
  • 유니티

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
그린티라떼
게임서버

쓰레드 기초

게임서버

쓰레드 기초

2020. 11. 30. 00:06

개론

 

프로세스 = 프로그램

쓰레드 = 프로그램 안에서 일하는 직원

CPU코어 = 직원에게 명령을 내림

 

* CPU코어 1개 / 쓰레드 여러 개인 상황 : 코어가 아주 짧은 시간 번갈아 가면서 쓰레드에게 명령을 내림

 

 


쓰레드 생성

using System;
using System.Threading;

namespace ServerCore
{
    class Program
    {
        static void MainThread()
        {
            Console.WriteLine("Hello Thread!");
        }

        static void Main(string[] args)
        {
            Thread t = new Thread(MainThread);  //정직원 고용
            t.Start();  //일 시작 

            Console.WriteLine("Hello World!");
        }
    }
}

* 쓰레드을 많이 늘리면 쓰레드가 일하는 시간보다 코어가 명령을 내리는 부하가 훨씬 심하다.

* 컴퓨터에 내장되어있는 코어 수만큼 쓰레드를 만드는 것이 바람직하다.

 

t.name = "Test Thread"; //직원 이름 부여
t.IsBackground = ture; // Main()이 끝날때 같이 종료
t.Join() // 쓰레드가 끝날 때까지 기다림 

 

쓰레드풀 생성

 static void MainThread(object state)
        {
            Console.WriteLine("Hello Thread!");
        }

        static void Main(string[] args)
        {
            ThreadPool.QueueUserWorkItem(MainThread);  //인력 사무소 알바생 고용
            ...
        }

* 쓰레드풀은 최대로 동시에 돌릴 수 있는 쓰레드 수를 제한을 함

* 일할 쓰레드가 없을 시 기존에 작업하던 쓰레드가 일을 끝내고 돌아오면 재투입함(새로운 쓰레드 생성 x)

* 쓰레드풀은 가급적이면 짧은 일감을 줘야 함

 

ThreadPool.SetMinThreads(1, 1); // 최소 쓰레드 수
ThreadPool.SetMaxThreads(5, 5); // 최대 쓰레드 수

첫 번째 인자 : int workerThreads

두 번째 인자 : int completionPortThreads

 

 

ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(5, 5);
            
for (int i = 0; i < 5; i++)
    ThreadPool.QueueUserWorkItem((obj) => { while (true) { } });

ThreadPool.QueueUserWorkItem(MainThread);

* 쓰레드풀에 가급적 짧은 일감을 줘야 하는 이유, 위의 경우 MainThread를 실행 못함.

* 문제점을 해결하기 위해 태스크를 사용하자

 

태스크

            ThreadPool.SetMinThreads(1, 1);
            ThreadPool.SetMaxThreads(5, 5);

            for (int i = 0; i < 5; i++) 
            {
                Task t = new Task(() => { while (true) { } }, TaskCreationOptions.LongRunning);
                t.Start();
            }
             
            ThreadPool.QueueUserWorkItem(MainThread);

* LongRunning이란 쓰레드풀에 들어가긴 할 텐데, 오래 걸리는 작업이란 걸 알려주고 workerThreadPool에서 뽑아 쓰는 것이 아니라 별도 처리를 함

* Task는 LongRunning으로 쓰레드풀을 유연하게 사용할 수 있다.

 

'게임서버' 카테고리의 다른 글

ReaderWriterLock 구현 연습  (0) 2020.12.01
하드웨어 최적화  (0) 2020.11.30
캐시 이론  (0) 2020.11.30
컴파일러 최적화  (0) 2020.11.30
    '게임서버' 카테고리의 다른 글
    • ReaderWriterLock 구현 연습
    • 하드웨어 최적화
    • 캐시 이론
    • 컴파일러 최적화
    그린티라떼
    그린티라떼

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.