승진이의 세상 살아가는 이야기  
Front Page
Tag | Location | Media | Guestbook | Admin   
 
'쓰레드'에 해당하는 글(4)
2007.11.30   primary 쓰레드가 종료되면 나머지 쓰레드로 종료될까?
2007.11.23   Daemon쓰레드 설정으로 프로그램 종료와 함께 쓰레드 종료시키기!
2007.11.23   자바 쓰레드 안전하게 종료시키는 것!!
2007.10.28   primary 쓰레드가 종료되면 나머지 쓰레드로 종료될까?


primary 쓰레드가 종료되면 나머지 쓰레드로 종료될까?

(primary) 스레드가 종료되면 나머지 스레드도 종료될까? ::

질럿: 윈도우즈 App에서 메인 쓰레드가 종료되면,,,,동작 중에 생성했던 쓰레드들도 종료되나요?
영진: 그렇지 않나요?
질럿: 나도 그런걸로 알고 있는데... 리눅스에서는 안그런것 같아서요
질럿: 앞에 앉은 사람이... 주메인 쓰레드가 종료해도... 다른 쓰레드들은 죽는데요
백지훈: 그러면 메인 쓰레드가 종료하면 자식 쓰레드가 남아서 일을 처리한다는 건가요?


시작은 이랬다. 질럿님의 당연한 듯한 질문. 돌이켜 보니 사실 내가 스레드에 대해서 알고 있는 사실은 하나도 없었다. ㅠㅠ 윈도우 개발자가 생각하는 스레드는 무엇일까? 년간 윈도우 환경에서만 개발을 나에게는 다음과 같은  막연한 생각들이 있었다.

1. 스레드는 프로세스에 포함되는 구성 요소다.
2.
프로세스는 반드시 하나 이상의 스레드로 구성된다.
3.
커널은 스레드 단위로 작업을 스케줄링한다.

 

 1 때문에 스레드는 프로세스 보다는 가볍다는 장점이 있다. 가상 주소 공간을 필요하지 않기 때문이다. 또한 변수들이 공유된다는 특징도 생긴다. 그래서 동기화에 신경을 써야 한다. 2번은 프로세스는 실행 단위가 아님을 나타낸다. 프로세스는 단지 스레드를 수행시키기 위한 컨테이너 정도로 생각할 있다. 코드는 전적으로 스레드에 의해서 수행된다. 3 때문에 컨텍스트 스위칭 비용이 발생한다. 때문에 다중 스레드가 싱글 스레드보다 효율이 느린 경우가 많다. 항상 스레드의 적절한 개수를 신경써야 한다.

이런 막연한 지식들을 바탕으로 질럿님의 질문으로 돌아가보자. (primary) 스레드가 종료되면 나머지 스레드도 종료될까? 여기에는 함정이 숨어 있다. 바로 (primary) 스레드라는 말이다. 통상적으로 윈도우 개발자들은 WinMain이나 main 수행시킨 최초의 스레드를 (primary) 스레드라고 말한다. 첫번째 스레드, first thread 하지 않고 (primary) 스레드라고 말할까? 그건 나도 모른다. 하지만 그게 함정이다. (primary)라는 말은 뭔가 녀석이 순서 외에도 특권을 가지고 있다는 생각을 하게 만들기 때문이다. 그래서 보통 (primary) 스레드가 죽으면 다른 것도 죽을 것이라고 생각한다.

view plaincopy to clipboardprint?

1.        DWORD WINAPI Func1(PVOID)  

2.        {  

3.            while(1)  

4.            {  

5.                printf("1\n");  

6.                Sleep(1000);  

7.            }  

8.        }  

9.         

10.      DWORD WINAPI Func2(PVOID)  

11.      {  

12.          while(1)  

13.          {  

14.              printf("2\n");  

15.              Sleep(1000);  

16.          }  

17.      }  

18.       

19.      int main()  

20.      {  

21.          DWORD tid;  

22.          CreateThread(NULL, 0, Func1, NULL, 0, &tid);  

23.          CreateThread(NULL, 0, Func2, NULL, 0, &tid);  

24.       

25.          return 0;  

26.      }  

DWORD WINAPI Func1(PVOID) { while(1) { printf("1\n"); Sleep(1000); } } DWORD WINAPI Func2(PVOID) { while(1) { printf("2\n"); Sleep(1000); } } int main() { DWORD tid; CreateThread(NULL, 0, Func1, NULL, 0, &tid); CreateThread(NULL, 0, Func2, NULL, 0, &tid); return 0; }
위와 같은 테스트 코드를 테스트 해보자. 메인이 끝나니 다른 것도 끝나는 것처럼 보인다. 이제 우리의 막연한 생각을 뒷바침해줄 근거까지 생겼다. "이제 이상 토론할 필요도 없는 것이다."라고 생각한다면 정말 제대로 함정에 빠지는 것이다.

함정에 빠지지 않기 위해서는 역으로 질문을 던져야 한다. main 리턴되면 프로그램이 끝나는 것일까? (primary) 스레드가 종료되었기 때문에 끝나는 것일까? 의심을 품고 디버깅을 해보면 답이 보인다. 메인 리턴 후의 경로를 살펴 보면 최종적으로 CRT 코드에서 ExitProcess 호출하는 것을 있다. 그렇다. (primary) 스레드가 끝나서 프로그램이 끝난게 아니라, (primary) 스레드 끝에서 ExitProcess 호출해서 프로그램이 끝난 것이다. 그렇다면 ExitProcess 호출하지 않는다면?

view plaincopy to clipboardprint?

1.            ExitThread(0);  

2.            return 0;  

3.        }  

ExitThread(0); return 0; }
위와 같이 코드를 고쳐 보았다. 코드는 진짜 질문의 의도대로 (primary) 스레드만 종료 시킨다. 테스트 해보면 알겠지만 남은 스레드로 프로그램은 버젓이 돌아간다. 스레드가 모두 종료되면 프로그램도 종료된다.

프로세스에 포함된 스레드 간에는 , 종관계가 없다. 평등한 관계다. 따라서 (primary) 스레드란 말도 잘못된 것이다. 시작 스레드 내지는 첫번째 스레드 정도가 정확한 용어라 있다. 또한 프로세스는 기본적으로 모든 스레드가 종료되어야 끝이난다.

신고
Tag : c, 쓰레드


Daemon쓰레드 설정으로 프로그램 종료와 함께 쓰레드 종료시키기!
public class DaemonThreadTest {
    public DaemonThreadTest() {
    }
    public static void main(String[] args) {
        Thread test = new Thread(){
            public void run(){
                try{
                    Thread.sleep(5000);
                    System.out.println("MyThread 종료");
                }catch(Exception e){
                    //무시
                }
            }
        };
        test.setDaemon(true);
        test.start();
        System.out.println("main() 종료");
    }
}
자바에서는 모든 쓰레드가 종료되어야 JVM이 종료되는데, 상황에 따라 분리된 쓰레드로 백그라운드 작업을 해야 하는 경우도 있다.
위 프로그램은 쓰레드를 데몬쓰레드로 설정함으로써 프로그램 종료시 쓰레드에 남아있는 작업이 있더라도 종료시킨다.
주의할 점은 쓰레드를 시작 전에 setDaemon을 주어야 한다는 것이다 .
어떤 스레드가 데몬 스레드인지, 일반 쓰레드인지 알고 싶다면 isDaemon()메소드를 통하여 알 수 있다.
신고
Tag : 쓰레드, 자바


자바 쓰레드 안전하게 종료시키는 것!!
class AdvancedStopThread implements Runnable {
    public void run() {
        try{
           while(!Thread.currentThread().isInterrupted()){
               System.out.println("Thread is alive..");
               Thread.sleep(250);
           }
        }catch(InterruptedException e){
            //e.printStackTrace()'; 예상했던 예외이므로 넘긴다.
        }finally{     //마무리할 작업(소켓,스트림,DB커넷션 등)이 있다면 이곳에서 정리.
            System.out.println("Thread is dead..");
        }
    }
}
public class ThreadTest {

    public static void main(String[] args) {
        AdvancedStopThread tt = new AdvancedStopThread();
        Thread test = new Thread(tt);
        test.start();
        try{
            Thread.sleep(1000);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        test.interrupt();
    }
}
위 프로그램은 자바에서 while조건문에서 isInterrupted()메소드로 스레드가 일시 정지되었는지를 확인한다. 또한 interrupt()메소드를 호출한 즉시 스레드를 중지시키고 finally문에서 안전하게 마무리 작업까지 할 수 있게 된다.
신고
Tag : 쓰레드, 자바


primary 쓰레드가 종료되면 나머지 쓰레드로 종료될까?

(primary) 스레드가 종료되면 나머지 스레드도 종료될까? ::

질럿: 윈도우즈 App에서 메인 쓰레드가 종료되면,,,,동작 중에 생성했던 쓰레드들도 종료되나요?
영진: 그렇지 않나요?
질럿: 나도 그런걸로 알고 있는데... 리눅스에서는 안그런것 같아서요
질럿: 앞에 앉은 사람이... 주메인 쓰레드가 종료해도... 다른 쓰레드들은 죽는데요
백지훈: 그러면 메인 쓰레드가 종료하면 자식 쓰레드가 남아서 일을 처리한다는 건가요?


시작은 이랬다. 질럿님의 당연한 듯한 질문. 돌이켜 보니 사실 내가 스레드에 대해서 알고 있는 사실은 하나도 없었다. ㅠㅠ 윈도우 개발자가 생각하는 스레드는 무엇일까? 년간 윈도우 환경에서만 개발을 나에게는 다음과 같은  막연한 생각들이 있었다.

1. 스레드는 프로세스에 포함되는 구성 요소다.
2.
프로세스는 반드시 하나 이상의 스레드로 구성된다.
3.
커널은 스레드 단위로 작업을 스케줄링한다.


Google AdSense 귀하의 웹사이트에서 수익을 창출하세요

1 때문에 스레드는 프로세스 보다는 가볍다는 장점이 있다. 가상 주소 공간을 필요하지 않기 때문이다. 또한 변수들이 공유된다는 특징도 생긴다. 그래서 동기화에 신경을 써야 한다. 2번은 프로세스는 실행 단위가 아님을 나타낸다. 프로세스는 단지 스레드를 수행시키기 위한 컨테이너 정도로 생각할 있다. 코드는 전적으로 스레드에 의해서 수행된다. 3 때문에 컨텍스트 스위칭 비용이 발생한다. 때문에 다중 스레드가 싱글 스레드보다 효율이 느린 경우가 많다. 항상 스레드의 적절한 개수를 신경써야 한다.

이런 막연한 지식들을 바탕으로 질럿님의 질문으로 돌아가보자. (primary) 스레드가 종료되면 나머지 스레드도 종료될까? 여기에는 함정이 숨어 있다. 바로 (primary) 스레드라는 말이다. 통상적으로 윈도우 개발자들은 WinMain이나 main 수행시킨 최초의 스레드를 (primary) 스레드라고 말한다. 첫번째 스레드, first thread 하지 않고 (primary) 스레드라고 말할까? 그건 나도 모른다. 하지만 그게 함정이다. (primary)라는 말은 뭔가 녀석이 순서 외에도 특권을 가지고 있다는 생각을 하게 만들기 때문이다. 그래서 보통 (primary) 스레드가 죽으면 다른 것도 죽을 것이라고 생각한다.

view plaincopy to clipboardprint?

1.        DWORD WINAPI Func1(PVOID)  

2.        {  

3.            while(1)  

4.            {  

5.                printf("1\n");  

6.                Sleep(1000);  

7.            }  

8.        }  

9.         

10.      DWORD WINAPI Func2(PVOID)  

11.      {  

12.          while(1)  

13.          {  

14.              printf("2\n");  

15.              Sleep(1000);  

16.          }  

17.      }  

18.       

19.      int main()  

20.      {  

21.          DWORD tid;  

22.          CreateThread(NULL, 0, Func1, NULL, 0, &tid);  

23.          CreateThread(NULL, 0, Func2, NULL, 0, &tid);  

24.       

25.          return 0;  

26.      }  

DWORD WINAPI Func1(PVOID) { while(1) { printf("1\n"); Sleep(1000); } } DWORD WINAPI Func2(PVOID) { while(1) { printf("2\n"); Sleep(1000); } } int main() { DWORD tid; CreateThread(NULL, 0, Func1, NULL, 0, &tid); CreateThread(NULL, 0, Func2, NULL, 0, &tid); return 0; }
위와 같은 테스트 코드를 테스트 해보자. 메인이 끝나니 다른 것도 끝나는 것처럼 보인다. 이제 우리의 막연한 생각을 뒷바침해줄 근거까지 생겼다. "이제 이상 토론할 필요도 없는 것이다."라고 생각한다면 정말 제대로 함정에 빠지는 것이다.

함정에 빠지지 않기 위해서는 역으로 질문을 던져야 한다. main 리턴되면 프로그램이 끝나는 것일까? (primary) 스레드가 종료되었기 때문에 끝나는 것일까? 의심을 품고 디버깅을 해보면 답이 보인다. 메인 리턴 후의 경로를 살펴 보면 최종적으로 CRT 코드에서 ExitProcess 호출하는 것을 있다. 그렇다. (primary) 스레드가 끝나서 프로그램이 끝난게 아니라, (primary) 스레드 끝에서 ExitProcess 호출해서 프로그램이 끝난 것이다. 그렇다면 ExitProcess 호출하지 않는다면?

view plaincopy to clipboardprint?

1.            ExitThread(0);  

2.            return 0;  

3.        }  

ExitThread(0); return 0; }
위와 같이 코드를 고쳐 보았다. 코드는 진짜 질문의 의도대로 (primary) 스레드만 종료 시킨다. 테스트 해보면 알겠지만 남은 스레드로 프로그램은 버젓이 돌아간다. 스레드가 모두 종료되면 프로그램도 종료된다.

프로세스에 포함된 스레드 간에는 , 종관계가 없다. 평등한 관계다. 따라서 (primary) 스레드란 말도 잘못된 것이다. 시작 스레드 내지는 첫번째 스레드 정도가 정확한 용어라 있다. 또한 프로세스는 기본적으로 모든 스레드가 종료되어야 끝이난다.



신고
Tag : C언어, 쓰레드


BLOG main image
항상 0에서 시작한다는 자세를 갖고 앞으로 나에게 가장 유리한 것이 무엇인지를 찾아라.
 Notice
 Category
분류 전체보기 (228)
승진이 이야기 (29)
승진이 공부중 (16)
승진이 자료실 (1)
승진이와 Android (1)
승진이와 Java (49)
승진이와 DB (10)
승진이와 영어 (3)
승진이와 책 (8)
승진이와 C (6)
승진이와 Web (15)
승진이와 정보 (68)
승진이와 XML (3)
승진이와 Q&A (2)
승진이의 Logs (0)
승진이와 사진 (1)
승진이와 Android (0)
승진이와 자동차 (4)
승진이와 이클립스 RCP (6)
승진이와 프로젝트들 (0)
승진이와 JavaScript (2)
승진이와 쉘프로그래밍 (0)
Flex (0)
 TAGS
새창으로 열기 검색 informix 문자열 넷빈즈 자바 c install.xml IzPack C언어 java.lang.NoClassDefFoundError 오라클 뒤로가기 버튼 엑셀 특수 문자 java surge Android 얼린 문 열기 자격증 FTP업로드 객체 참조 쓰레드 리눅스 디렉토리명 크로스 브라우저 리눅스 팁 LPIC 신협중앙회 문자열 검색 pk fk 조회 펀드 에러 쉘스크립트 스윙 수식 SDK Setup.exe 디렉토리 변경 Preference
 Calendar
«   2017/09   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
 Recent Entries
ORA-32039: 순환 WITH 절에는 열 별칭 목록..
rexpert 오라클 접속 설정 방법
간단한 코드 테이블 설계
String padding 자바스크립트
jquery selector 셀렉터 표현식으로 찾기
이광영 부장판사 솜방망이 처벌 관련 링크들
sql 디벨로퍼 각주 제거 생성 단축키
jquery 이용하여 프린트 1
테이블 자동 줄바꿈 처리 방법
문자 찍는 함수 CHR() 함수와 ASCII()함수
 Recent Comments
5년이란 시간동안 my..
은성훈 - 2014
한국새끼들이 이래서..
qweqwe - 2014
mysql도 rollup기능..
ㄴㄴㄴ - 2014
감사합니다
고마워요 - 2012
헐.. 정말인가요? 사..
BreathAir - 2011
저는 이제서야 관련..
originkim - 2011
아주 막장 그자체라..
기술자 - 2010
request의 parameter..
님 짱!! - 2010
제가 목격한 건데요...
^^ - 2010
네 도대체 왜 그렇게..
BreathAir - 2010
 Recent Trackbacks
スタッドレスタイヤ..
スタッドレスタイヤ..
野球ス ミズノ
野球ス ミズノ
ve may bay
ve may bay
visit this web page..
visit this web page..
timeshare vacation..
timeshare vacation..
joogle.in
joogle.in
arassegaf.com
arassegaf.com
new Software techno..
new Software techno..
www.douloschurch.com
www.douloschurch.com
fix DBF file
fix DBF file
 Archive
2013/12
2013/11
2013/04
2013/03
2012/09
 Link Site
내 마음속 폭풍은 아직 아..
괴짜 프로그래머의 일상사~..
Joel on Software
Android 개발자 커뮤니티 ,..
developer.com
Jace\'s Blog
오라클 10g Documentation
Programing Note (승만이)
실용주의를 꿈꾸며(이클립..
http://pragmatic.kr
자바 누리 기술 문서 / 매..
Reflect
Java API 6.0 한글번역
eclipse resources 문서 링..
자바 관련 소스 많은 곳
미디어 파일 (무제한 웹하드)
http://younghoe.info/
Open Knowledge Share Drea..
키스포토 (사진강좌와 사진..
외국 드라마 TV show 자막..
무료 ebooks
지금샵
 Visitor Statistics
Total : 229,204
Today : 37
Yesterday : 78
rss