쓰레드에서 선언한 변수 참조하는 방법 질문요?
글쓴이: joungis / 작성시간: 수, 2008/05/21 - 10:41오전
쓰레드 함수에서 각각 선언한 변수를 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);
}
Forums:
lib함수
lib 함수를 호출할 때 lock을 걸면 어때요?
Thread_A에서 호출한 lib이 수행이 끝나기 전까지 Thread_B는 lib의 호출을 대기..
머리를 굴려라! 그래야 먹고 산다.
pthread_getspecific pthread_s
pthread_getspecific
pthread_setspecific
이 두 함수의 man page를 참조하세요. main에서 처음에 pthread_key_create를 불러줘야 합니다. (만약 이런저런 사정으로 main에 넣을 수 없으면 library에서 pthread_once를 이용해 초기화할 수 있습니다. 역시 man page 참조.)
요즘 몇몇 컴파일러에서는 __thread를 붙여서 변수를 만들면 아예 변수 자체가 thread-local 변수로 잡혀 버려서 이런 삽질을 피할 수 있는데 이게 아마 표준은 아닌 걸로 알고 있습니다.
TLS(Thread local storage)를
TLS(Thread local storage)를 말하고 있습니다.
gcc의 경우, glibc에 TLS Support로 컴파일되어 있는 버젼이라면, __thread 키워드를 사용하여 손쉽게 TLS를 사용할 수 있습니다. 다만, __therad 키워드를 통한 TLS의 경우 동적 라이브러리 방식에서는 사용할 수 없습니다.
時日也放聲大哭
時日也放聲大哭
글로발 변수를 사용하지 않는 것을 추천합니다.
위의 예에서는 변수 전달을 하심이 어떠신지...
글로발 변수에 넣고 싶으시다면
문자열배열로 해서 모든 쓰레드의 이름을 저장하는 방법이라면
어케 전역의 의미를 가질 지도 모르겠네요.
개인적으로 쓰레드 로컬 변수는 편리하긴 한데
프로그램 포인터하고 스텍만 있다는 정의로 볼 때
약간 쓰기 꺼려지네요..
여튼, 전역변수에 의존하는 코드는 나중에 수정하기 까다로워 질 가능성도 커집니다.
답변 감사합니다.
맞습니다. TLS! 제가 원한거...
지식이 짧다보니 글로 풀어서 얘기를 한다는 게 얼마나 힘든지 실감했습니다.
혼자서 끙끙 앓았는데 답변 감사합니다.
댓글 달기