반응형
동기화 란 ?
작업들 사이의 수행 시기를 맞추는 것
-> 다수의 스레드가 동시에 공유 자원을 사용할 때 순서를 정하는 것
복수의 스레드가 있을 때 문제가 된다.
지금 작업하고 있으니까 너는 대기해 이런식으로 순서를 정하는 것을 동기화라고 합니다.
동기화 키워드와 클래스
lock : 동기화 키워드
Monitor
Mutex
Interlocked
AutoResetEvent
ManualResetEvent
동기화 대상
* 공유 자원에 대한 접근이 예상되는 스레드
* 한 객체를 다수의 스레드가 사용되는 때
lock 형식
private object obj = new object();
lock( obj )
{
임계(경계) 영역 (critical section)
}
lock 주의할 점
*lock(this)
*lock(typeof(클래스명))
->위와 같이 사용하는 것은 자제 할 것!
lock 사용 예
* 공유 자원(변수)을 스레드가 사용하는 예
*
*lock과 private object 형을 사용한 동기화
*
이렇게 lock 키워드를 사용 하면 !
Thread id 3 번이 1에서 10번까지 충분히 스레드를 사용 하고 나서
Thread id 4 번이 다시 해당 스레드에 접근하여 작업을 한다 !
해당 스레드 사용중에 다른 곳에서 접근하여 스레드를 뺏어쓰는 경우가 없어진다.
* 스레드 함수가 객체를 통해 값을 증가하는 예
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace ConsoleApp15
{
class ThisLock
{
public void IncreadCount(ref int count)
{
count++;
}
}
class Test
{
static int count; // 공유 자원
static object obj = new object();
ThisLock lockObject = new ThisLock();
public void Proc()
{
lock (lockObject) // 다른 스레드가 해당 메서드를 사용할려고 때 기다려! 잡아주는 역할
{
for (int i = 0; i < 10; i++)
{
lockObject.IncreadCount(ref count);
count++;
Console.WriteLine($"Thread id : {Thread.CurrentThread.GetHashCode()}, result : {count}");
}
}
}
}
class Program
{
static void Main(string[] args)
{
Test test = new Test();
//하나의 객체를 두개의 스레드에서 사용
Thread[] threads = new Thread[3];
for (int i = 0; i < 3; i++)
{
threads[i] = new Thread(new ThreadStart(test.Proc));
}
for (int i = 0; i < 3; i++)
{
threads[i].Start();
}
}
}
}
Monitor 클래스 사용하기
반응형
'C#' 카테고리의 다른 글
C# - 네트워크 , Socket , TCP소켓 대해 알아보자 (3) | 2023.10.17 |
---|---|
C# 문법 - String 문자열을 Enum으로 바꾸는 방법 /Trim(Char[])로 원하는 문자 제거 /구조체의 차이점 복습 (1) | 2023.10.17 |
C# - PDA 프로그램 개발 DataGridView 정렬과 row 이동하기 (DataTable, DataView 사용) (1) | 2023.10.15 |
C# 기초 문법 진법 boolen형, 형변환, .ReadLine() , .Parse ,연산자 (0) | 2023.06.13 |
C# 개발 - Devexpress Gridcontrol 사용하여 데이터 출력하기 (0) | 2023.06.12 |
C# 개발 - 라즈베리 파이에서 온습도 데이터베이스 C# 차트로 표현 가능! (0) | 2023.05.23 |