쓰레드 우선순위를 수행중간에 변경할수 있나요?

oneclubs의 이미지

pthread를 공부하고 있습니다..

pthread_create 2번째 인자 attrbute값에 대해 NULL만주다가 프로그램 제작하다보니
쓰레드가 우선순위에따라 동작하더라구요
그래서 찾아보니

pthread_attr_getschedparam() 와 같은 함수를 사용해서
pthread_create 2번째 인자값을 설정하여 쓰레드의 우선순위를 줄수 있더군요..

혹시 저 우선순위를 중간에 변경할수 있는 방법이 없을까요?
예를 들면..
A와 B 두개의 쓰레드가 있는데.. A가 B보다 우선순위가 높습니다.
우선순위가 높다고 꼭 그런건 아닌거 같긴 한데..대체로 우선순위로 수행되는거 같더라구요

1 B가 잠을자고
2 A에서 어떤일을 하다가 B를 깨우고 잠을 잡니다.
3 B가 일을 수행하고 A를 깨우고 잠을 잡니다.

A의 남은 일을 수행할때까지 B가 잠을자지 않더군요 A가 끝난다음에 잠을 자더군요
그래서..
3번에서 B가 A를 깨우기전에, A와 우선순위를 싹 바꿔서 A를 깨우고 잠을 자면,,
원하는대로 일처리가 될꺼 같더라구요
근데 이런 방식이 가능한가요??

왠지..느낌상..생각해보면.. 쓰레드가 생성하기전에 우선순위를 줘서 생성한건데..
바꿀수 없을거 같은 느낌이..
그래서 일단 임시방편으로 3번에서 B한테 신호를 받은 A는 usleep으로 잠시 쉬면, B가 먼저 잠을 자더라구요
이렇게 하긴했는데..

정리하면..
1. 수행중간에 쓰레드 우선순위를 바꿀수 있나요?
2. sleep함수를 줘서 저렇게 쓰레드 수행순서를 바꾸는게 항상 작동한다고 볼수 있나요? 지금은 0.5초정도 A를 재웠는데
환경이 바뀌거나, 상황에 따라(외부에서 시그널이 들어온다던가 돌아가는 프로그램이 많다던가) 항상 원하는대로 동작할수 있나요?

bushi의 이미지

우선순위를 조절하시려는 목적이 단순히 sleep/wakeup 의 sync 를 맞추기 위해서라면,
생각을 달리 해보시죠.
http://kldp.org/node/102510

OTL

jick의 이미지

쓰레드의 우선순위를 달리 하는 건 상당히 고급 기능에 속합니다.
......라는 얘기는 시스템마다 달라질 수 있고, 잘 돌아가는 것처럼 보이다가도 환경이 조금만 바뀌면 달라질 수 있고, 쓰레드 전문가(??) 수준이 아니면 코드가 원하는 동작을 한다고 확신할 수 없다는 얘깁니다.

쓰레드가 어떤 조건이 (X라고 합시다) 만족될 때까지 잠들어야 한다면 "너 X가 만족될 때까지 자라"라는 코드를 넣는 것이 맞습니다. 여기에는 세 가지(?) 방법이 있는데,

1번: (좋은 방법은 아니지만 공부나 간단한 테스트 코드라면 허용할 수 있는 수준)
while (!X) usleep(100);

2번: (업무에 쓰일 코드라면 이 방법으로 짜야 함, 예제는 쓰레드 프로그램 관련 책을 찾아보면 많이 나옵니다)
* 기다리는 쓰레드: pthread_cond_wait, sem_wait, read, 기타 다양한 명령을 활용하여 sleep 상태로 들어갑니다
* X 조건을 만족시키는 쓰레드: X가 만족되는 순간 pthread_cond_notify, sem_post, write, 기타 다양한 명령을 활용하여 기다리는 쓰레드를 깨웁니다

3번: (자신의 정신건강과 직장에서의 좋은 동료평가 결과를 위해선 절대 쓰지 말아야 하는 방법)
일단 "usleep(100)"이라고 쳐넣고 원하는 결과가 나올 때까지 숫자를 늘려본다.

kerino의 이미지

1. 수행중간에 쓰레드 우선순위를 바꿀수 있나요?
네.. 가능합니다.
nice() , setpriority(), sched_setscheduler() pthread_setschedparam().... 으로 변경 가능.

그 외에 renice로도 동작중인 쓰레드를 변경이 가능합니다.

2. sleep함수를 줘서 저렇게 쓰레드 수행순서를 바꾸는게 항상 작동한다고 볼수 있나요? 지금은 0.5초정도 A를 재웠는데
환경이 바뀌거나, 상황에 따라(외부에서 시그널이 들어온다던가 돌아가는 프로그램이 많다던가) 항상 원하는대로 동작할수 있나요?

아니요.

kerino의 이미지

1. 수행중간에 쓰레드 우선순위를 바꿀수 있나요?
네.. 가능합니다.
nice() , setpriority(), sched_setscheduler() pthread_setschedparam().... 으로 변경 가능.

그 외에 renice로도 동작중인 쓰레드를 변경이 가능합니다.

2. sleep함수를 줘서 저렇게 쓰레드 수행순서를 바꾸는게 항상 작동한다고 볼수 있나요? 지금은 0.5초정도 A를 재웠는데
환경이 바뀌거나, 상황에 따라(외부에서 시그널이 들어온다던가 돌아가는 프로그램이 많다던가) 항상 원하는대로 동작할수 있나요?

아니요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.