누군가에게 이 글에 대한 메일을 받았습니다. if문 안에 wait를 썼는데 문제가 없나요? 이펙티브 자바 3판 item 80에서는 반복문 안에 wait를 쓰라는데. 사실 item 80은 wait notify 대신에 동시성 유틸리티를 쓰라는 겁니다. 그런데, 이 아이템에 언급된 것들 중에 짚고 넘어가야 할 문장들이 꽤 많은데, 그 중 하나는 반복문 안에 wait를 써라. 였습니다. 그만큼 어려우니, 그냥 동시성 유틸리티를 쓰라는 그림이였을지도 모르지만요. 메일로도 언급되었으니 짚고 넘어가겠습니다. 링크에 언급되었던 문제 상황을 바꾸어 보겠습니다. 2명의 생산자가 각각 10개의 item을 생산하고, 2명의 소비자가 각각 10개의 item을 소비합니다. 먼저, worker1 스레드 2개와 worker2 스레드..
Wait 검색 결과
리눅스에서 wait와 waitpid는 프로세스의 종료 상태를 리턴해 주는 함수입니다. pid_t waitpid(pid_t pid,int *statloc,int options); 성공을 하면, 프로세스 ID를, 오류가 발생하면 -1을, 그 외의 경우에는 0을 리턴합니다. 그런데, 이 함수가 wait와 다른 점은, 특정한 자식 프로세스를 기다리게 할 수 있다는 것입니다. 일단 위의 두 옵션만 아셔도 무난할 듯 싶어요. 프로세스 그룹은, 추후에 다시 설명해 드리도록 하겠습니다. 3번째 인자의 옵션이 중요한데요. WNOHANG, WCONTINUED, WUNTRACED 등이 있어요. sleep sort를 설명했을 때, 옵션으로 준 것은 이 중 1번째 것이였는데요. 이 때에는 종료된 자식이 존재하지 않아도, 블로킹..
fork 함수로 자식 프로세스를 생성할 수 있다고 하였습니다. 그러면, 부모 프로세스가 자식 프로세스가 종료가 될 때 까지 대기를 하게 할 수 없을까요? 그럴 때 wait 함수를 쓰시면 됩니다. pid_t wait(int *stat); 성공 시에, 종료된 자식의 pid를, 실패하면 -1을 반환합니다. 물론 stat에 NULL값을 넣어도 되는데요. 이 때에는, 전달된 매개변수에 상태값을 저장하지 않습니다. man ps를 쳐 봅시다. 스크롤을 쭉 내리시면 아래와 같은 설명이 나오는데요. 이는, 상태값에 따른 프로세스의 상태를 의미해요. 여기서 보아야 할 것은 R, 그러니까 run queue에 있는 상태. 이것과 S인데요. S는 interruptible sleep을 의미합니다. 인터럽트를 받을 수 있는 sle..
오늘은 비슷한 것 같지만 완전히 다른 Thread의 sleep 함수랑 Object의 wait 함수를 이야기 해 보도록 하겠습니다. 이 둘은 쓰레드를 자게 하는 거니까, 왠지 같을 것 같은데, 실제로는 차이가 있어요. 예제 프로그램을 봅시다. 먼저 저는 My_object 객체 a와 b를 생성했어요. 그리고, worker를 200개 생성했는데요. 이 클래스의 내부를 봅시다. 이것은, Thread를 extend한 것인데요. 일단 My_object를 참조하는 레퍼런스 타입이 안에 들어있네요. 그리고, run 안에는 a.foo() 라는 친구를 수행하는데요. 그러면 My_object라는 클래스도 봐야 겠네요. 이 안에는 그냥 x가 start 되었다는 것과 끝났다는 것을 출력해 주기만 합니다. 그런데 내부에 wait..
최근댓글