이 글에서는 제가 출제했던 문제인 가희와 읽기 쓰기 놀이를 왜 냈는지, 그리고 어떻게 풀어야 하는지 써 보도록 하겠습니다. 가희와 읽기 쓰기 놀이는, race condition을 주제로 만들어진 문제입니다. 그리고 N과 C가 9보다 작거나 같기 때문에, brute force를 돌려도 됨을 알 수 있어요. N과 C가 9보다 작거나 같다는 조건을 읽은 순간, 아. 그냥 백트래킹 돌려도 되겠구나. 이게 와야 해요. 출제 의도가 race condition이라고 했는데, 어째서 경쟁 상태일까요? 단순히 턴제 게임 아니였나요? 턴제 게임은 맞습니다. 맞는데, 다른 관점에서 봐 봅시다. 1번 사람이 1번, 2번 카드 순으로 내고, 2번 사람이 3번 카드를 낼 수 있다고 합시다. 그리고 1번은 a를 뒤에 추가, 2번은..
경쟁상태 검색 결과
안녕하세요. 이번 시간에는 race condition과 관련이 깊은 toctou에 대해서 알아보려고 합니다. 검사 시점과 사용 시점을 주의깊게 보시면 됩니다. 예제 프로그램을 하나 보겠습니다. 유저 객체 하나가 있습니다. Task는 유저 객체 하나를 받습니다. 그리고 Thread에 유저 객체 u가 들어간 task를 넘겨줌을 알 수 있어요. Thread를 다 돌리고, 유저의 포인트가 0보다 작아지면 u.getPoint()의 값을 출력하고 break를 걸어요. 여기서 질문. 0보다 작아지는 경우가 생길 수 있을까요? Task는 간단한 일을 수행해요. 단지, run에서 7포인트를 소비할 뿐이에요. consumePoint는 현재 포인트가 a보다 클 때, 현재 포인트에서 a를 빼게 됩니다. 사실, 우리는 결과를 ..
누군가에게 이 글에 대한 메일을 받았습니다. if문 안에 wait를 썼는데 문제가 없나요? 이펙티브 자바 3판 item 80에서는 반복문 안에 wait를 쓰라는데. 사실 item 80은 wait notify 대신에 동시성 유틸리티를 쓰라는 겁니다. 그런데, 이 아이템에 언급된 것들 중에 짚고 넘어가야 할 문장들이 꽤 많은데, 그 중 하나는 반복문 안에 wait를 써라. 였습니다. 그만큼 어려우니, 그냥 동시성 유틸리티를 쓰라는 그림이였을지도 모르지만요. 메일로도 언급되었으니 짚고 넘어가겠습니다. 링크에 언급되었던 문제 상황을 바꾸어 보겠습니다. 2명의 생산자가 각각 10개의 item을 생산하고, 2명의 소비자가 각각 10개의 item을 소비합니다. 먼저, worker1 스레드 2개와 worker2 스레드..
race condition은 경쟁 상태를 의미합니다. 둘 이상의 무언가가 자원에 접근한다고 생각하면 어떨까요? 그리고 그것의 상태를 바꾸려고 한다면 어떨까요? 아래 프로그램을 보겠습니다. 리소스인 LinkedBlockingQueue가 있습니다. BlockingQueue는 쉽게 말해 동기화가 된 큐라고 생각하시면 됩니다. Executor 내부 구현에 쓰이기도 합니다. 여기에서 BlockingQueue에 대해 심도 있는 내용을 다루지 않겠습니다. 여기에서는 내부적으로 lock을 이용해서 Thread Safe 하다는 것 정도만 이해하셔도 무난합니다. Worker1은 Queue에 수를 추가합니다. 0부터 99까지 순서대로 추가를 합니다. 그리고, Worker2는 수를 뺍니다. Main 함수에서는 worker1과..
안녕하세요. 이번 시간에는 리눅스 pipe 함수에 대해서 알아보도록 하겠습니다. file 데스크립터 2개를 저장할 배열을 넘겨주기만 하면 됩니다. 그것을 넘겨주면, 그 배열에 하나는 파이프에서 읽기를, 하나는 쓰기를 할 수 있는 데스크립터가 생성됩니다. 각각 filedes[0], filedes[1]이 그 역할을 합니다. 예제 1번 프로그램을 보도록 하겠습니다. 먼저, text가 2개 있습니다. 하나는 "Hello", 하나는 "Bye" 입니다. 파이프를 생성한 다음에, fork로 자식 프로세스를 생성합니다. 상황이 대략적으로 이렇게 그려집니다. 그리고 부모에서는, 단순하게 "Hello"라는 text를 write 하기만 하고, 자식은 받기만 합니다. 일단, 자식의 pi[0]과 부모의 pi[0], 그리고 자식..
최근댓글