C#의 일반적인 동시 수집 및 스레드 안전 문제

WBOY
풀어 주다: 2023-10-09 22:49:02
원래의
1283명이 탐색했습니다.

C#의 일반적인 동시 수집 및 스레드 안전 문제

C#의 일반적인 동시 컬렉션 및 스레드 안전 문제

C# 프로그래밍에서 동시 작업 처리는 매우 일반적인 요구 사항입니다. 여러 스레드가 동시에 동일한 데이터에 액세스하고 수정할 때 스레드 안전 문제가 발생합니다. 이 문제를 해결하기 위해 C#에서는 몇 가지 동시 수집 및 스레드 안전 메커니즘을 제공합니다. 이 문서에서는 C#의 일반적인 동시 컬렉션과 스레드 안전 문제를 처리하는 방법을 소개하고 구체적인 코드 예제를 제공합니다.

  1. Concurrent Collection

1.1 ConcurrentDictionary

ConcurrentDictionary는 C#에서 일반적으로 사용되는 동시 사전 컬렉션으로, 여러 스레드가 동시에 서로 다른 키-값 쌍을 읽고 쓸 수 있도록 하며 스레드 동기화를 자동으로 처리하는 메커니즘을 제공합니다. . 다음은 ConcurrentDictionary 사용의 예입니다.

ConcurrentDictionary<string, int> concurrentDict = new ConcurrentDictionary<string, int>();

// 添加键值对
concurrentDict.TryAdd("key1", 1);
concurrentDict.TryAdd("key2", 2);

// 更新值
concurrentDict.TryUpdate("key1", 3, 1);

// 删除键值对
int value;
concurrentDict.TryRemove("key2", out value);
로그인 후 복사

1.2 ConcurrentQueue

ConcurrentQueue는 여러 스레드가 대기열 끝에 요소를 추가하고 대기열의 헤드에 요소를 가져오고 삭제할 수 있도록 하는 C#의 스레드로부터 안전한 대기열 컬렉션입니다. 동시. 다음은 ConcurrentQueue를 사용하는 예입니다.

ConcurrentQueue<int> concurrentQueue = new ConcurrentQueue<int>();

// 入队
concurrentQueue.Enqueue(1);
concurrentQueue.Enqueue(2);

// 出队
int result;
if(concurrentQueue.TryDequeue(out result))
{
    // 处理出队的元素
}
로그인 후 복사

1.3 ConcurrentBag

ConcurrentBag는 여러 스레드가 동시에 요소를 추가하고 제거할 수 있도록 하는 C#의 스레드로부터 안전한 순서가 지정되지 않은 컬렉션입니다. 다음은 ConcurrentBag 사용 예입니다.

ConcurrentBag<int> concurrentBag = new ConcurrentBag<int>();

// 添加元素
concurrentBag.Add(1);
concurrentBag.Add(2);

// 移除元素
int result;
if(concurrentBag.TryTake(out result))
{
    // 处理移除的元素
}
로그인 후 복사
  1. 스레드 안전 문제

2.1 경쟁 조건

레이스 조건은 여러 스레드가 공유 리소스에 액세스하는 순서로 인해 발생하는 결과의 불확실성을 나타냅니다. 경쟁 조건을 해결하기 위해 잠금 메커니즘(잠금)을 사용하여 공유 리소스에 대한 다중 스레드 액세스를 상호 배제할 수 있습니다. 다음은 경쟁 조건을 해결하기 위해 잠금을 사용하는 예입니다.

class Counter
{
    private int count;

    public void Increment()
    {
        lock (this)
        {
            count++;
        }
    }

    public int GetCount()
    {
        lock (this)
        {
            return count;
        }
    }
}
로그인 후 복사

2.2 Deadlock

Deadlock은 여러 스레드가 서로 리소스를 해제하기를 기다리고 있어 프로그램이 계속 실행될 수 없는 상황을 말합니다. 교착 상태를 방지하려면 동일한 순서로 잠금을 획득하거나 try-finally 문을 사용하여 리소스가 정상적으로 해제되도록 할 수 있습니다. 다음은 간단한 교착 상태 예입니다.

class Deadlock
{
    private static object lock1 = new object();
    private static object lock2 = new object();

    static void Main(string[] args)
    {
        Thread thread1 = new Thread(() => {
            lock (lock1)
            {
                Thread.Sleep(1000); // 为了让另一个线程有机会获取lock2
                lock (lock2)
                {
                    // do something
                }
            }
        });

        Thread thread2 = new Thread(() => {
            lock (lock2)
            {
                Thread.Sleep(1000); // 为了让另一个线程有机会获取lock1
                lock (lock1)
                {
                    // do something
                }
            }
        });

        thread1.Start();
        thread2.Start();
    }
}
로그인 후 복사

위는 C#의 일반적인 동시 컬렉션 및 스레드 안전 문제와 특정 코드 예를 소개합니다. 동시 프로그래밍을 수행할 때 이러한 메커니즘과 문제를 이해하고 스레드 안전성을 보장하기 위한 적절한 솔루션을 선택해야 합니다. 동시 컬렉션을 올바르게 사용하고 스레드 안전 문제를 방지함으로써 프로그램의 성능과 안정성을 향상시킬 수 있습니다.

위 내용은 C#의 일반적인 동시 수집 및 스레드 안전 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!