생성된 쓰레드를 다시 초기화??(재시작??) 시키는 법~

aryuze의 이미지

안녕하세요
임베디드 OS에 대해 공부하고 있는 학생입니다.

쓰레드를 초기화시키는 부분에 대해서 질문이 있습니다.

다음과 같이 쓰레드가 존재하고 특정작업을 수행한다고 했을 때

void* thread1(void* pdata){

....
....
....

}

이 쓰레드가 특정 작업수행을 마치고 일정 시간의 주기마다 계속 다시 호출 되어 수행

되도록 하고 싶습니다.

while문을 사용하지 않고 다시 동작을 재시작 시킬려면 어떻게 해야하나요??

즉,
while(1){
....
....
....
delay(100);
}

이런식 말구요 쓰레드 전체가 아예 새로 시작되도록 하고 싶어요

그렇다고 해당 쓰레드를 삭제하고 다시 수행시키는 것이 아니라

기존의 쓰레드를 그대로 둔 채 다시 시작되도록 하고 싶은데 어떻게 해야 될까요??

고수님들 도와 주세요~

(주기는 커널에서 다 관리해준다고 가정합니다. 즉 커널에서 주기마다 쓰레드를 깨우는데 쓰레드가 처음부터 다시 수행되도록 하는 겁니다.^^)

소타의 이미지

pthread_cond 쪽을 보시는건 어떨까요?

while ( 1 )
{
  pthread_cond_wait( cond, lock );
 
  //할 일 코드들
}

이건 쓰레드가 종료되는 방식은 아닙니다;
쓰레드를 종료했다가 새로 띄우면 내부적으로는 재사용하지 않나요?
aryuze의 이미지

while문을 안쓰고 구현해야 합니다

쓰레드를 종료했다가 새로 띄우는 작업은 오버헤드가 좀 큰 것 같아서요

종료하지 않고 재시작 시키는데 딱 필요한 부분만 초기화해서 다시 수행시킬려고

하는데 잘 안되네요...ㅠ.ㅠ

어쨌든 감사합니닷!!! ^^

mithrandir의 이미지

thread api만 가지고는 안될 것 같습니다.

윗분이 써주신 코드가 적절해보이네요.
while(1)을 쓰기 싫으신 이유가 있는건가요?

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

aryuze의 이미지

연구실에서 구현한 임베디드 OS가 있는데요

교수님께서 그렇게 구현해보라고 요구하셔서요

사실 while(1)을 사용하면 쉽게 구현할 수 있는데...

thread api를 사용하지 않고

커널에서 지원해주도록 구현할려고 합니다.

해당 쓰레드를 다시 깨울때

쓰레드의 스택이랑 스택 포인터를 초기화 해주면 될 꺼라고 생각했는데

안되네요....ㅠ.ㅠ

방법이 없을까요???

MasterQ의 이미지

이해가 안가는 부분:
--
이런식 말구요 쓰레드 전체가 아예 새로 시작되도록 하고 싶어요

그렇다고 해당 쓰레드를 삭제하고 다시 수행시키는 것이 아니라

기존의 쓰레드를 그대로 둔 채 다시 시작되도록 하고 싶은데 어떻게 해야 될까요??
--
* thread전체가 아예 새로 시작
* 기존의 쓰레드를 그대로 둔 채

thread1을 다시 호출하면 된다는건지, 아니면 이 thread1이 생성되면서 만들어진 thread state들을 초기화해서 시작하라는건지 이해가 잘 안갑니다.

제가 이해한것은 thread을 등록/삭제하는 api들이 존재하는데, 이것들중 등록 API만 사용하면서, thread1이란 녀석은 처음부터 끝까지 호출이 되어서 (한번 불리면 stack에서 사라짐) 어떤 signal을 기다릴수 있는 상태도 아니고, preempt된 상태도 아님. 그러나 thread1은 다시 불려야 함. 제가 이해를 맞게 한건가요?

aryuze의 이미지

제가 글을 좀 이상하게 적었죠?ㅋ

사실 실제로 제가 구현하려고 하는 것은 주기적으로 동작하는 쓰레드 인데요

이를 커널에서 직접 관리하도록 하는 것입니다.

즉 처음에 이 주기적인 쓰레드를 생성하여 커널에 등록하면

커널에서 내부적으로 해당 주기를 계산해서, 그 주기마다 해당 쓰레드를 깨워서 수행되도록 하는 건데요
(쓰레드는 대기 상태에 있다가 주기에 맞춰서 깨어나도록...)

그 쓰레드가 깨어날때 처음 쓰레드를 생성해서 동작하는 것 처럼 만들려고 합니다.

이때 해당 쓰레드를 삭제하고 다시 생성하는게 아니라

처음 등록했던 쓰레드에서 특정 부분만 초기화(혹은 수정)해서 구현 할 수 있을것 같아서요

즉, 쓰레드의 다를 여러 attribute들은 변경될 필요가 없고

스택포인터 등을 초기화하면 해당 쓰레드를 다시 수행할 수 있을 것 같은데

잘 안되네요~

도와주세요~~ㅠ.ㅠ

kaeri17의 이미지

스택포인터 나오는 걸 보니 그냥 C로는 못할것 같은데요... 임베디드 OS라고 했으니 POSIX Thread가 지원 되는지도 모르겠고 그냥 쓰레드 끝날때 PC레지스터 수정하는 인라인 어셈 추가하는게 제일 나을듯 합니다. 근데 이건 쓰레드가 계속 메모리에 상주해 있다고 가정하고 해야할듯 하네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.