쓰레드에서 선언한 변수 참조하는 방법 질문요?

joungis의 이미지

쓰레드 함수에서 각각 선언한 변수를 lib함수에서 참조할 방법이 없을까요?
Thread_A에서 호출한 lib함수는 Thread_A에서 선언한 변수를 참조하고,
Thread_B에서 호출한 lib함수는 Thread_B에서 선언한 변수를 참조하게금 만들고 싶은데요..
Thread함수에서 lib함수에 인자를 전달하면 되겠지만 그렇게 안하고 구현하려합니다.
아래소스는 그냥 예시인데, 제가 하고자 하는 것도 글로 표현하기가 참 힘드네요.
Thread_A와 Thread_B는 아주 빈번하게 호출된다고 가정하구요.
global변수를 뮤텍스로 처리해주면 되겠지만 그렇게 하면 순차처리가 되지않을까 싶어서요.
더 좋은방법을 찾고 있습니다.

char *global;

int Thread_A(void)
{
char A[100]="Thread_A";
global = A;
lib();
}

int Thread_B(void)
{
char B[100]="Thread_B";
global = B;
lib();
}

int lib(vooid)
{
printf("쓰레드 : %s\n", global);
}

uosarang의 이미지

lib 함수를 호출할 때 lock을 걸면 어때요?
Thread_A에서 호출한 lib이 수행이 끝나기 전까지 Thread_B는 lib의 호출을 대기..

머리를 굴려라! 그래야 먹고 산다.

jick의 이미지

pthread_getspecific
pthread_setspecific

이 두 함수의 man page를 참조하세요. main에서 처음에 pthread_key_create를 불러줘야 합니다. (만약 이런저런 사정으로 main에 넣을 수 없으면 library에서 pthread_once를 이용해 초기화할 수 있습니다. 역시 man page 참조.)

요즘 몇몇 컴파일러에서는 __thread를 붙여서 변수를 만들면 아예 변수 자체가 thread-local 변수로 잡혀 버려서 이런 삽질을 피할 수 있는데 이게 아마 표준은 아닌 걸로 알고 있습니다.

shyblue의 이미지

TLS(Thread local storage)를 말하고 있습니다.

gcc의 경우, glibc에 TLS Support로 컴파일되어 있는 버젼이라면, __thread 키워드를 사용하여 손쉽게 TLS를 사용할 수 있습니다. 다만, __therad 키워드를 통한 TLS의 경우 동적 라이브러리 방식에서는 사용할 수 없습니다.

時日也放聲大哭

時日也放聲大哭

rhheo의 이미지

위의 예에서는 변수 전달을 하심이 어떠신지...

글로발 변수에 넣고 싶으시다면
문자열배열로 해서 모든 쓰레드의 이름을 저장하는 방법이라면
어케 전역의 의미를 가질 지도 모르겠네요.

개인적으로 쓰레드 로컬 변수는 편리하긴 한데
프로그램 포인터하고 스텍만 있다는 정의로 볼 때
약간 쓰기 꺼려지네요..

여튼, 전역변수에 의존하는 코드는 나중에 수정하기 까다로워 질 가능성도 커집니다.

joungis의 이미지

맞습니다. TLS! 제가 원한거...
지식이 짧다보니 글로 풀어서 얘기를 한다는 게 얼마나 힘든지 실감했습니다.
혼자서 끙끙 앓았는데 답변 감사합니다.

댓글 달기

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