• 티스토리 홈
  • 프로필사진
    유니얼
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
유니얼
  • 프로필사진
    유니얼
    • 분류 전체보기 (295)
      • Unity (17)
        • 게임 개발 (5)
      • Unreal (24)
        • 게임 개발 (20)
      • DirectX (36)
      • 코딩테스트 (91)
        • 프로그래머스 (25)
        • 백준 (66)
      • Google Workspace (1)
      • Programing (102)
        • C# (68)
        • C++ (24)
        • JavaScript (10)
      • 게임 서버 프로그래밍 (17)
      • Web (6)
        • 슈퍼코딩 (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
    등록된 댓글이 없습니다.
  • 최근 공지
    등록된 공지가 없습니다.
# Home
# 공지사항
#
# 태그
# 검색결과
# 방명록
  • ReaderWriterLock: 동시 읽기와 단독 쓰기를 위한 동기화 메커니즘
    2024년 03월 18일
    • 유니얼
    • 작성자
    • 2024.03.18.:16
    728x90

    C# 게임 서버 만들기

    멀티쓰레딩 환경에서 데이터를 동기화하는 방법은 다양합니다. 그중 ReaderWriterLock은 읽기 작업이 많고 쓰기 작업이 적은 경우에 효율적인 동기화를 제공하는 방식입니다. 이 글에서는 ReaderWriterLock의 개념과 사용법, 그리고 예제 코드를 통해 이를 어떻게 활용할 수 있는지 알아보겠습니다.

    ReaderWriterLock이란?

    ReaderWriterLock은 여러 쓰레드가 동시에 읽기 작업을 수행할 수 있도록 허용하면서, 쓰기 작업을 수행하는 쓰레드는 단독으로 접근하도록 하는 동기화 메커니즘입니다. 즉, 쓰기 작업이 없을 때는 여러 쓰레드가 데이터를 동시에 읽을 수 있지만, 쓰기 작업을 시작하려는 쓰레드가 있으면 해당 쓰레드는 읽기 작업을 수행 중인 모든 쓰레드가 작업을 완료할 때까지 대기해야 합니다.

    작동 원리

    • 읽기 잠금(AcquireReaderLock): 데이터를 읽으려는 쓰레드는 읽기 잠금을 획득합니다. 다른 쓰레드들도 읽기 잠금을 획득할 수 있으며, 이는 동시에 여러 쓰레드가 데이터를 읽을 수 있음을 의미합니다.
    • 쓰기 잠금(AcquireWriterLock): 데이터에 쓰기를 수행하려는 쓰레드는 쓰기 잠금을 획득해야 합니다. 쓰기 잠금을 획득하려면 모든 읽기 작업이 완료될 때까지 대기해야 하며, 쓰기 잠금이 활성화된 동안 다른 쓰레드는 읽기 또는 쓰기 작업을 수행할 수 없습니다.

    예제 코드

    아래 예제는 ReaderWriterLock을 사용하여 공유 데이터에 대한 읽기 및 쓰기 작업을 동기화하는 방법을 보여줍니다.

    using System;
    using System.Threading;
    
    class ReaderWriterLockExample
    {
        private static ReaderWriterLock rwLock = new ReaderWriterLock();
        private static int sharedData = 0;
    
        public static void ReadData()
        {
            try
            {
                rwLock.AcquireReaderLock(Timeout.Infinite);
                Console.WriteLine($"Reading data: {sharedData}");
            }
            finally
            {
                rwLock.ReleaseReaderLock();
            }
        }
    
        public static void WriteData(int value)
        {
            try
            {
                rwLock.AcquireWriterLock(Timeout.Infinite);
                sharedData = value;
                Console.WriteLine($"Writing data: {sharedData}");
            }
            finally
            {
                rwLock.ReleaseWriterLock();
            }
        }
    
        static void Main()
        {
            // 쓰기 작업을 수행하는 쓰레드
            Thread writerThread = new Thread(() => WriteData(42));
            writerThread.Start();
            writerThread.Join();
    
            // 읽기 작업을 수행하는 쓰레드들
            Thread[] readerThreads = new Thread[5];
            for (int i = 0; i < readerThreads.Length; i++)
            {
                readerThreads[i] = new Thread(ReadData);
                readerThreads[i].Start();
            }
    
            foreach (var t in readerThreads)
            {
                t.Join();
            }
        }
    }

    이 예제에서는 ReaderWriterLock을 사용하여 공유 데이터 sharedData에 대한 접근을 관리합니다. WriteData 메서드에서는 쓰기 작업을 수행하기 전에 쓰기 잠금을 획득하고, 작업 완료 후에 잠금을 해제합니다. ReadData 메서드에서는 읽기 작업을 수행하기 전에 읽기 잠금을 획득하고, 작업 완료 후에 잠금을 해제합니다.

    결론

    ReaderWriterLock은 읽기 작업이 많고 쓰기 작업이 적은 멀티쓰레딩 환경에서 효율적인 동기화 방법을 제공합니다. 이를 통해 동시에 여러 쓰레드가 데이터를 읽을 수 있도록 하면서도, 데이터의 일관성과 무결성을 유지할 수 있습니다. 올바르게 사용한다면 ReaderWriterLock은 애플리케이션의 성능과 안정성을 크게 향상시킬 수 있습니다.

    반응형
    다음글
    다음 글이 없습니다.
    이전글
    이전 글이 없습니다.
    댓글
조회된 결과가 없습니다.
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
목차
표시할 목차가 없습니다.
    • 안녕하세요
    • 감사해요
    • 잘있어요

    티스토리툴바