'CreateThread'에 해당되는 글 1건

  1. 2011.11.02 [c언어] strtok 사용법 및 쓰레드에서 사용시 유의사항
문자열을 특정 기준으로 분리하는 함수이다.
가령
char text[] = "The quick brown fox jumps over the lazy dog."; 라는 문자열을 단어로 분리하고 싶은 경우,
' ' 공백 문자를 기준으로 토큰 분리하면 된다.
"The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog."

char text[] = "The quick brown fox jumps over the lazy dog."; char seps[] = " "; // 이곳에 분리의 기준이 되는 문자를 나열하면 된다. char *p; if( (p = strtok( text, seps )) != NULL ){ printf("%s\n", p); while( (p = strtok( NULL, seps) != NULL){ printf("%s\n", p); } }

여기서 처음 strtok()를 사용할때, 첫번째 인자로, 분리의 대상이 되는 문자열을 파라미터로 넘겼다.
하지만, 이후 strtok()에서는, NULL을 넘기면서, 분리의 대상이 되는 문자열을 넘기지 않았다.
strtok() 함수 내부에서, 처음 넘긴 문자열을 가리키는 포인터를 보관하고 있다는 뜻이다.
따라서, strtok()로 모두 분리가 완료 되기 전에, 다른 문자열을 분리할 수 없다.

쓰레드를 이용해서 동시에 작업하는 경우, 이 내부 변수가 문제가 될 수 있다. 각 쓰레드별로 이런 내부변수를 개별적으로 가지고 있어야 할것이다. 윈도우 환경에서, CreateThread()로 쓰레드를 생성할 경우, 이런 내부 변수를 두고 사용하는 함수에서 문제가 된다. _beginthreadex()로 쓰레드를 생성해야 하는 이유중 하나다.

_beginthreadex()는 내부적으로 CreateThread()를 호출하여 쓰레드를 생성한다. 하지만, 그전에 struct _tiddata 구조체를 통해, 이런 내부 변수를 저장하는 별도의 공간을 마련한 후 쓰레드를 생성한다.

쓰레드가 종료되면, _tiddata 구조체 블록을 해제해야 한다. CreateThread()로 쓰레드 생성한 경우, 대부분 _tiddata 블록이 잘 관리가 되지만, 비정상적인 쓰레드 종료시 _tiddata 블록이 해제 되지 않으면, 메모리 누수가 된다. 


Posted by Нуеоп
이전버튼 1 이전버튼