보통 우리가 사용하는 컴퓨터들은 병렬적으로 처리되기 때문에 그게 당연하다고 생각할 수 있다.
근데 비동기적으로 안돌아가는 싱글 쓰레드 프로그램이 있다면 그림을 그리는 동시에 버튼을 누르는 이벤트가 일어나면 멈춰버릴 것이다.
뭐.... 요즘 저런 경우는 거의 없다고 보면 되지만 저런 프로그램도 MultiThread를 지원한다면 해결할 수 있다.
오늘은 특정 상황에 대해서 Thread를 생성해서 병렬적으로 돌아가게 해야하는 문제를 마주쳤다.
멀티 쓰레드 이녀석은 생각보다 민감한 녀석이기에..... 조심히 다루어야한다.
원래 그게 번거로울거 같아서 그냥 프로세스로 나눠서 할까 하다가 프로세스간 통신하게 하는것도 엄청 번거로울거 같아서 그냥 눈 비용적인 측면 고려했을때 자식 쓰레드를 생성하기로 했다.
오늘 한일
수행 해야되는 로직은 특정 파일을 읽게 했을 때 하나의 쓰레드는 파일을 읽어오고 다른 하나의 쓰레드는 내가 원래 하던 행동을 계속 하게 해주는 역할을 한다.
그래서 쓰레드에 어제 만졌던 파일 읽어오는 로직을 사용하여 파일을 읽어온다.
어제 만들었던 것을 사용하여 구현하려고 했다.
그런데 파일을 읽어오는 속도가 좀 느린 것 같은 체감이 들었다.
문제는 처음 스트림을 생성하고 버퍼를 이용해서 읽어올 때 내가 어제 만들어놓은 버퍼는 테스트용으로 만들어놨기에 사이즈가 작아서 병목현상이 일어나서 오래 걸리는 것이었다.
삽질도 많이 했고 스스로 디테일을 살리지 못해서 아쉬웠다....
그리고 또 하나 알아갈 디테일이 존재했는데 쓰레드를 생성하다가 생기는 예외를 처리를 하는 부분이다.
예외 처리 할 때를 예를 봐보자
//... 원래의 제어흐름
try{
//쓰레드 생성
Thread.Create()
}
catch{
//쓰레드에게 할당된 자원해제
}
아무 생각없이 이처럼 코드 중간에 Thread를 생성하는 코드를 넣었을때 현재 나의 코드는 문제없이 동작한다고 생각한다.
하지만 중간에 특정한 이유로 문제가 생기면 할당 중간에 예외 처리가 되버리면
이미 할당된 자원이 없는데 없는 자원을 해제하겠다고 하는 꼴이라 잘못된 코딩이라고 한다.
// 쓰레드 생성
Thread_Create()
try {
//쓰레드생성 이후 할 동작
}
catch{
// 쓰레드에 생성된 자원 회수
}
주의 깊게 보지 못하면 실수하기 좋으니 머리속에 넣어둬야겠다.
'일상,취미' 카테고리의 다른 글
다시 시작하는 TIL4일차.... (0) | 2024.06.10 |
---|---|
다시 시작하는 TIL3일차.... (1) | 2024.06.07 |
다시 시작해보는 TIL....1일차 (0) | 2024.06.04 |
옵저버 패턴의 쓰임새 (1) | 2024.04.21 |
직접 구현 하면서 이해해보는 전략패턴 (0) | 2024.04.14 |