스레딩 4

스레드 동기화 - 기타 (이중 확인 락, 조건 변수, 컬렉션)

2022.05.29 - [언어/C#] - 복합 스레드 동기화 요소 복합 스레드 동기화 요소 2022.05.09 - [언어/C#] - 단순동기화3 - 커널 모드 동기화 단순동기화3 - 커널 모드 동기화 2022.05.06 - [언어/C#] - 단순동기화2 (유저 모드 동기화 요소) 커널 모드 동기화 요소 커널 모드 동기화 요소는 tsyang.tistory.com 이중 확인 락 기법 늦은 초기화(Lazy initialization)를 이용해 싱글톤 객체를 생성할 때, 다수의 스레드가 동시에 싱글톤 객체를 요청한다면 싱글톤 객체가 여러 번 생성될 수 있다. 따라서 스레드 동기화를 통해 싱글톤 객체가 단 한 번만 생성되도록 해줘야 하는데 이때 자주 사용되는 기법이 이중 확인 락(double-check locki..

언어/C# 2022.06.05

단순동기화3 - 커널 모드 동기화

2022.05.06 - [언어/C#] - 단순동기화2 (유저 모드 동기화 요소) 커널 모드 동기화 요소 커널 모드 동기화 요소는 유저 모드 동기화 요소에 비해서 상당히 느리다. 왜냐? 커널 모드 동기화 요소가 운영체제에게 스레드 간의 동기화를 요청해서 그렇다. 또한 각각의 메서드들은 커널 객체를 이용하게 되고 이로 인해 스레드가 관리 코드 -> 네이티브 유저 모드 -> 네이티브 커널 모드 (돌아올 때도 역순으로 반복함) 위와 같은 전환을 일으켜 CPU 시간을 엄청나게 소비하기 때문이기도 하다. 그래도 커널 모드 동기화 요소를 쓰는 이유가 있다. 리소스에 대한 경쟁 상태를 확인할 수 있다. 스레드가 CPU를 낭비하지 않도록 한다. 네이티브 스레드와 관리 스레드 사이에서도 동기화를 할 수 있다. 동일 컴퓨터..

언어/C# 2022.05.09

단순동기화2 - 유저 모드 동기화

2022.05.01 - [언어/C#] - CLR 단순 동기화1 CLR 단순 동기화1 스레드 동기화 스레드 동기화는 일반적으로 다수의 스레드가 공유 데이터에 '동시에' 접근하는 경우에도 데이터가 손상되는 것을 막기 위해서 사용된다. 그러나 스레드 동기화는 많은 문제를 tsyang.tistory.com 유저 모드 동기화 요소 CLR은 bool, byte, short, int, float, 참조 타입의 변수에 대해서는 원자적(atomic)으로 값을 읽고 쓸 수 있음을 보장한다. 이게 뭔말이냐면 int x = 0; x = 0x01234567; x 변수가 0x00000000에서 0x01234567로 한 번에 번경된다는 말이다. 즉, 변경 중인 상태의 값을 얻어올 가능성이 없다는 말이다. 엥.. 그럼 아닌 경우도 ..

언어/C# 2022.05.06

CLR 스레딩3 - 태스크(Task)

2022.04.17 - [언어/C#] - CLR 스레드 단순 계산 작업 태스크 앞선 글에서 계산 중심의 비동기 작업을 주행하기 위해 ThreadPool 의 QueueUserWorkItem을 호출하는 방식을 소개헀다. 그러나 이 방법은 작업 완료 시점과 작업 수행의 결과를 얻을 수 있는 방법을 제공하지 않고 있다는 한계가 있다. 그래서 생긴게 태스크(tasks) 라는 개념이다. //ThreadPool을 이용한 방식 ThreadPool.QueueUserWorkItem(obj => Sum(1000)); //Task를 이용한 방식1 var task = new Task(() => Sum(1000)); task.Start(); //Task를 이용한 방식2 Task.Run(() => Sum(1000)); 태스크의 결..

언어/C# 2022.04.24