pthread 동기 인가요? 비동기 인가요?

biokk의 이미지

예를들어

pthread(&id, NULL, th_test, &test);
pthread_detach(id);

void th_test()
{
while(1)
{
....
}
}

이런소스가 있으면 pthread에 의해서 th_test가 스레드 함수로 따로 동작으로 하는데 그 안에는 무한루프로 되어 있는데
동기라면 무한루프가 종료되지 않기때문에 프로그램이 종료되지 않는이상 pthread_detch()가 실행이 안될것이고
비동기라면 무한루프에 상관없이 바로 스레드가 종료될것 같은데

동기로 동작하는게 맞는거죠?;;

Anti-Lock의 이미지

제 생각에는 동기든 비동기든...
프로그램이 종료하지 않으면 계속 무한루프 돌것 같습니다.
이게 기본적인 동작 아닌가요?

주 스레드가 끝나면, 프로그램 종료로 처리되고,
다른 실행중인 스레드는 일찍 죽는(?)일이 발생할 수 있습니다.
이런것을 방지하기 위해서 동기화 기법이 사용될 수도 있겠죠...
동기화 기법이 전혀 사용되지 않고 있다면, 스레드는 비동기라고 볼수 있을 것 같습니다.

a287848의 이미지

pthread_detach 가 아니라 pthread_join 이 더 적합해 보이네요.

join 에서 계속 block 되겠죠.

Dig it.

DCode의 이미지


Thread loop condition을 상수 1 또는 true로 하는 것은 바람직하지 않습니다.

거의 반드시라고 해도 좋을만큼 Thread 생성을 담당하는 Thread쪽에서(main 함수도 Thread입니다)

Loop condition을 제어하는 flag를 Thread 인자로 넘겨주고,

종료시에는 이 flag를 가지고 Thread가 스스록 종료되도록,

Thread 생성측의 종료는 이렇게 생성한 Thread들의 종료를 pthread_join으로 대기하여 확인되도록 하는 게 좋습니다.

biokk의 이미지

리눅스 프로그램 경험이 많이 없어서 그러는데요
몇 블로그나 책을 보면 join, detach 가 스레드 종료시 메모리 해제를 하는데
detach가 join에 비해 메모리해제를 확실히 해준다고 해서 detach가 좋다고 했었던걸 봤던 기억이 있었거든요
(detach는 join에 비해 메모리해제를 보장한다 이렇게 알고 있습니다;;)

두개 모두 스레드 종료될때까지 기다리다가 스레드함수가 종료되면 종료시키는 것이 아닌지요

DCode의 이미지


답글을 달아놓고 이전 소스들을 찾아봤더니

main thread에서 다른 Thread들을 모두 생성하고 종료시키는 것이 아니라

다른 핸들링 thread에서 임의의 또다른 thread를 생성하고 종료시키는 경우가 생겨서

플래그 처리를 해야 했던 경우였네요.

Process가 종료되면 그 Process가 만들어둔 Thread들은 전부 종료되는데,

이 때 임의 생성한 Thread를 detach 시켜두면 자원의 반납이 보장되는 게 맞다고 알고 있습니다.

아래의 게시글도 유용하리라 생각합니다.

https://kldp.org/node/90637

다만 원론적인 이야기로 돌아가서,

원칙적으로 쓰레드가 종료되는 시점을 결정하는 것은 해당 쓰레드 외부가 아니라

자신의 루틴에서 pthrad_exit로 마무리 짓는 것이 맞다고 알고 있습니다.

cinsk의 이미지

detached thread를 만드는 것은, 꼭 필요한 상황이 아니면, 별로 추천하고 싶지 않습니다.

main thread에서 해당 thread가 끝났는지 여부를 판단할 수 있도록 pthread_join()을 쓰는 것이 좋습니다.

댓글 달기

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