pthread_mutexattr_settype 에 관하여

osanha의 이미지

Gentoo linux, gcc 4.1.2, nptl 환경입니다.
pthread_mutex_lock내에서 pthread_mutex_trylock 을 써야 하는 상황이 있어.
mutex를 PTHREAD_MUTEX_RECURSIVE 타입으로 생성할려고 하는데..

pthread_mutexattr_settype 함수의 원형 및 PTHREAD_MUTEX_RECURSIVE 정의가 없다고 나옵니다.
pthread.h 헤드파일을 보면 #ifdef __USE_UNIX98 안에 들어가 있어서
그것을 define 했는데도 계속 못찾군요..

solaris 나 hp-ux에서는
PTHREAD_MUTEX_RECURSIVE 를 이용한 pthread_mutexattr_settype 사용에 있어 아무 문제가 없습니다.
리눅스의 man page를 봐도 특별한 note도 없는데 말이죠...

어쩌면 NTPL 환경이라서 그런것 같습니다.
pthread.h 헤드를 보면 PTHREAD_MUTEX_RECURSIVE_NP 정의가 있기 때문이죠.
우선 그것을 사용해서 테스트해본 바 의도했던대로 동작은 하는군요.
허나 이기종간 이식성을 위해 #ifdef 구문을 사용할려고 하는데 무엇을 define으로 찾아야 할지 모르겠군요

관련해서 조언바랍니다.

osanha의 이미지

http://man.kldp.org/wiki/ManPage/pthread_mutexattr_init.3 를 보니..
아래와 같은 구문이 있군요.

Quote:
LinuxThreads는 오직 하나의 뮤텍스 속성 만을 지원한다: 그것은 뮤텍스의 종류(kind)로, ``패스트'' 뮤텍스인 경우 PTHREAD_MUTEX_FAST_NP, ``재귀'' 뮤텍스인 경우 PTHREAD_MUTEX_RECURSIVE_NP, ``에러 체킹'' 뮤텍스인 경우 PTHREAD_MUTEX_ERRORCHECK_NP 로 각각 설정된다. NP 라는 접미어는, 이것은 POSIX 표준에 대한 이식성 없는 확정임을 나타내며, 이식성있는 프로그램을 작성하기 위해서는 이 기능을 사용해서는 안된다.
...
pthread_mutexattr_setkind_np 는 attr 내의 뮤텍스 종류 속성을 kind 에 저장된 값으로 설정한다.
pthread_mutexattr_getkind_np 는 attr 내의 현재 뮤텍스 종류 속성 값을 kind 가 가리키는 위치에 저장한다.

헌데, 왜 man 에서는 pthread_mutexattr_setkind_np 는 없고 POSIX 표준인 pthread_mutexattr_settype 이 나오는걸까요. 아무런 note도 없이..
또한, 헤드파일에 분명 __USE_UNIX98 을 define하면 표준 함수를 쓸 수 있는걸로 보이는데 정의를 넣어도 안되는 이유를 모르겠군요.

osanha의 이미지

흠..

c 파일에서 h 파일 include 하기전에 아래와 같이해서 pthread_mutexattr_settype 등을 원형을 불러올 수 있게 되긴 합니다만,

#define __USE_UNIX98
#include <pthread>
#undef __USE_UNIX98

gcc 컴파일 옵션에서 -D 를 이용한 정의에서는 먹히지 않는군요. 어디선가 undef 를 하는걸까요.
여하튼, 전체를 __USE_UNIX98로 정의하는것보다는 상기 코드처럼 필요한 소스내에서만 하는게 더 좋다고 생각은 드네요.

osanha의 이미지

대부분의 헤더 상단에서 인클루드 하고 있는 features.h 에서 여러가지 심볼들을 처리하더군요.
미리 모든 심볼들을 undef 한 후에 다시 재정립 하는 방식이며 pthread.h에서도 이것을 인클루드 하고 있구요.
결론적으로,
__USE_UNIX98 이 포함될려면 _XOPEN_SOURCE 가 500이상의 값을 가지면 되는데.
이는 또한, _GNU_SOURCE 를 정의하면 대부분의 심볼들이 정의되는군요. _XOPEN_SOURCE는 600으로 설정되구요.
따라서,
gcc 옵션에서 -D_GNU_SOURCE 또는, -D_XOPEN_SOURCE=500 또는, -D_XOPEN_SOURCE=600 을 추가하면 됩니다.

댓글 달기

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