pthread 와 Invalid Handle 값?

shkim의 이미지

pthread_t 와 ~cond_t, ~mutex_t 세개의 타입을 쓰는데요,

C++ 클래스의 멤버 변수로 썼어요.

클래스를 만들때, 생성자에는 초기화되지 않은 값으로 셋팅하고

Create() 메소드에서 초기화 한 후

Destroy() 메소드에서 해제하고 핸들을 초기화되지 않은 값으로 다시 셋팅하고

파괴자(destructor) 에서 해제를 했나 검사를 합니다..

뻔한 스토리죠?

Win32 에서는 HANDLE 변수에 INVALID_HANDLE_VALUE 라는 값을 넣음으로 위 작업을 할 수 있었습니다.

그런데 pthread*_t 에서는 INVALID_HANDLE_VALUE 에 대응하는 뭔가가 뭔지 모르겟습니다 !!

일단.. 컴파일러가 에러를 내서 다음과 같이는 쓸 수 없더군요.

MyEvent::MyEvent()
{
m_mutex = PTHREAD_MUTEX_INITIALIZER;
m_cond = PTHREAD_COND_INITIALIZER;
}

리턴값을 던질 수 없는 생성자에서 pthread_mutex_init 등을 호출하고 싶지는 않습니다.
저는 try/catch 를 싫어하거든요;;

현재로서는 다른 변수를 두어 pthread 관련 변수들이 초기화 되었는지를 기록하고 있습니다만

메모리 낭비 같습니다.

뭔가 좋은 방법 없을까요???

pizza1977의 이미지

이니셜라이져가 왜 안될까요?? 소스함 보세요

포탈이는 불사신

-------------
포탈이는 불사신

shkim의 이미지

소스를 보면 없는 답이 생깁니까? 포탈이는 불사신? 이건 또 무슨 소린지.. -_-

여기 쟁쟁한 분들도 많은데 제가 C 기초 문법 설명해야 하나요?

함수 밖에서 struct 변수에 { ... } 로 선언하며 값 셋팅하는 것이 ~INITIALIZER 입니다.

함수 내부에서 변수에 값을 대입하는 용도로 쓰려면 컴파일 에러를 내죠.

님이나 헤더 파일 소스 똑바로 보고 낄데인지 안낄데인지 생각 좀 해보시죠.

pizza1977의 이미지

낄데 안낄데...먼가 죄송한 일을 한것 같은데 먼질 몰겠네요.

소스를 보는게 C기초인지는 잘 모르겠습니다만

이니셜라이져가 하는 짓거리가 초기화(소스를 따라가면 다 '0'으로 초기화 시킵니다)임으로
정말 하고 싶으시면 다 0으로 채우시면 되겠다 싶었고(걍 memset으로)...

포인터형을 쓰시면 걍 간단하게 널포인터 주고 start, cleanup 구현하고 싶은대로 하심 될것 같네요.

기분이 참 우울하네요.

포탈이는 불사신

-------------
포탈이는 불사신

shkim의 이미지

한줄로, 헤더 파일 소스 봐라~ 라고 답글 단 것이 저도 썩 기분 좋지는 않았습니다.

그런데 흔히 이런 opaque handle 이라는 것은 내부를 봐도 못본것으로 해야 합니다.

그렇기 때문에 헤더 보고 sizeof(struct) 만큼 0 으로 memset 하는 것은

포팅을 생각한다면 절대로 하면 안되는 일입니다.

실제로 Win32 용 pthread 헤더를 보면 완전히 다르게 구현되어 있습니다.

winner의 이미지

pthread 공부할 때 그런 거 기억이 안나는군요.

그리고 쟁쟁한 사람들이 누군지는 모르겠습니다만 겸손은 자기 자신부터 찾는게 좋다고 봅니다.

댓글 달기

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