생성된 쓰레드를 다시 초기화??(재시작??) 시키는 법~
글쓴이: aryuze / 작성시간: 화, 2010/07/13 - 5:50오후
안녕하세요
임베디드 OS에 대해 공부하고 있는 학생입니다.
쓰레드를 초기화시키는 부분에 대해서 질문이 있습니다.
다음과 같이 쓰레드가 존재하고 특정작업을 수행한다고 했을 때
void* thread1(void* pdata){
....
....
....
}
이 쓰레드가 특정 작업수행을 마치고 일정 시간의 주기마다 계속 다시 호출 되어 수행
되도록 하고 싶습니다.
while문을 사용하지 않고 다시 동작을 재시작 시킬려면 어떻게 해야하나요??
즉,
while(1){
....
....
....
delay(100);
}
이런식 말구요 쓰레드 전체가 아예 새로 시작되도록 하고 싶어요
그렇다고 해당 쓰레드를 삭제하고 다시 수행시키는 것이 아니라
기존의 쓰레드를 그대로 둔 채 다시 시작되도록 하고 싶은데 어떻게 해야 될까요??
고수님들 도와 주세요~
(주기는 커널에서 다 관리해준다고 가정합니다. 즉 커널에서 주기마다 쓰레드를 깨우는데 쓰레드가 처음부터 다시 수행되도록 하는 겁니다.^^)
Forums:
pthread_cond 쪽을
pthread_cond 쪽을 보시는건 어떨까요?
이건 쓰레드가 종료되는 방식은 아닙니다;
쓰레드를 종료했다가 새로 띄우면 내부적으로는 재사용하지 않나요?
while문을 안쓰고
while문을 안쓰고 구현해야 합니다
쓰레드를 종료했다가 새로 띄우는 작업은 오버헤드가 좀 큰 것 같아서요
종료하지 않고 재시작 시키는데 딱 필요한 부분만 초기화해서 다시 수행시킬려고
하는데 잘 안되네요...ㅠ.ㅠ
어쨌든 감사합니닷!!! ^^
thread api만 가지고는
thread api만 가지고는 안될 것 같습니다.
윗분이 써주신 코드가 적절해보이네요.
while(1)을 쓰기 싫으신 이유가 있는건가요?
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
연구실에서 구현한
연구실에서 구현한 임베디드 OS가 있는데요
교수님께서 그렇게 구현해보라고 요구하셔서요
사실 while(1)을 사용하면 쉽게 구현할 수 있는데...
thread api를 사용하지 않고
커널에서 지원해주도록 구현할려고 합니다.
해당 쓰레드를 다시 깨울때
쓰레드의 스택이랑 스택 포인터를 초기화 해주면 될 꺼라고 생각했는데
안되네요....ㅠ.ㅠ
방법이 없을까요???
이해가 안가는
이해가 안가는 부분:
--
이런식 말구요 쓰레드 전체가 아예 새로 시작되도록 하고 싶어요
그렇다고 해당 쓰레드를 삭제하고 다시 수행시키는 것이 아니라
기존의 쓰레드를 그대로 둔 채 다시 시작되도록 하고 싶은데 어떻게 해야 될까요??
--
* thread전체가 아예 새로 시작
* 기존의 쓰레드를 그대로 둔 채
thread1을 다시 호출하면 된다는건지, 아니면 이 thread1이 생성되면서 만들어진 thread state들을 초기화해서 시작하라는건지 이해가 잘 안갑니다.
제가 이해한것은 thread을 등록/삭제하는 api들이 존재하는데, 이것들중 등록 API만 사용하면서, thread1이란 녀석은 처음부터 끝까지 호출이 되어서 (한번 불리면 stack에서 사라짐) 어떤 signal을 기다릴수 있는 상태도 아니고, preempt된 상태도 아님. 그러나 thread1은 다시 불려야 함. 제가 이해를 맞게 한건가요?
제가 글을 좀
제가 글을 좀 이상하게 적었죠?ㅋ
사실 실제로 제가 구현하려고 하는 것은 주기적으로 동작하는 쓰레드 인데요
이를 커널에서 직접 관리하도록 하는 것입니다.
즉 처음에 이 주기적인 쓰레드를 생성하여 커널에 등록하면
커널에서 내부적으로 해당 주기를 계산해서, 그 주기마다 해당 쓰레드를 깨워서 수행되도록 하는 건데요
(쓰레드는 대기 상태에 있다가 주기에 맞춰서 깨어나도록...)
그 쓰레드가 깨어날때 처음 쓰레드를 생성해서 동작하는 것 처럼 만들려고 합니다.
이때 해당 쓰레드를 삭제하고 다시 생성하는게 아니라
처음 등록했던 쓰레드에서 특정 부분만 초기화(혹은 수정)해서 구현 할 수 있을것 같아서요
즉, 쓰레드의 다를 여러 attribute들은 변경될 필요가 없고
스택포인터 등을 초기화하면 해당 쓰레드를 다시 수행할 수 있을 것 같은데
잘 안되네요~
도와주세요~~ㅠ.ㅠ
꼭 쓰레드 API일 필요 있나요...
스택포인터 나오는 걸 보니 그냥 C로는 못할것 같은데요... 임베디드 OS라고 했으니 POSIX Thread가 지원 되는지도 모르겠고 그냥 쓰레드 끝날때 PC레지스터 수정하는 인라인 어셈 추가하는게 제일 나을듯 합니다. 근데 이건 쓰레드가 계속 메모리에 상주해 있다고 가정하고 해야할듯 하네요.
댓글 달기