
도와주세요!!
안녕하세요.
저는 초보입니다.
쓰레드와 전역변수에 대하여 궁금한 사항이 있어서 문의 드립니다.
아래의 예제와 같이 구현할 경우 쓰레드 함수에서는 전역변수 값을 변경하지만
메인함수 무한루프 문에서는 전역변수의 값을 변경하지 않는 경우에도
꼭!!! 뮤텍스를 사용하여야만 하는지요.
즉 <1> <2> <3> <4> 모두 생략하면 안되는지요.
너무 초보적인 질문이라 생각되지만 고수님들의 답변 부탁드립니다.
예제)
#include <pthread.h>
... <생략>...
pthread_mutex_t imsi_mutex = PTHREAD_MUTEX_INITIALIZER;
int g_imsi = 0;
void *thread_func(void *arg)
{
while (1) {
pthread_mutex_lock(&imsi_mutex); // <1>
g_imsi++;
pthread_mutex_unlock(&imsi_mutex); // <2>
sleep(1);
}
}
int main()
{
pthread_t thread_id;
pthread_create(&thread_id, NULL, thread_func, NULL);
usleep(100);
while (1) {
pthread_mutex_lock(&imsi_mutex); // <3>
printf("imsi=%d\n", g_imsi);
pthread_mutex_unlock(&imsi_mutex); // <4>
sleep(1);
}
reutrn 0;
}
결국 크리티컬섹션은 싱크와 용도를 생각해야 합니다.
가령 위와 같은 경우 API의 아래부분과 위부분 UI라고 생각해 보죠.
아래 API에서의 설정값이 바뀔때 UI에 실시간으로 정확한 값을 반영할 필요가 없다고 하면...
꼭 mutex로 잠그지 않아도 될겁니다.
위와 같은 경우 사용하지 않았을 경우를 생각해보죠.
그러니까 printf에서 g_imsi의 값을 사용하는 그 시점을 말하는 겁니다.
printf로는 g_imsi의 값이 스택을 통해 전달이 됩니다.
이건 printf에서 스택이 아니라 전역변수를 그대로 참조한다고 해도 마찬가지 입니다.
실제 원자적인게 보장이 되지 않는다면 인스트럭션 하나 이상이라면 보장될 수 없다고 가정하는게 맞겠죠.
결국 실제 printf에서 g_imsi의 값을 찍는 순간 전역변수 g_imsi의 값은 다른 값일 수 있다는 얘기죠.
용도를 생각해야 된다 라고 말했는데 결국 이런 특징이 있다는걸 판단해야하고 이게 문제가 된다라고 프로그래머가 판단한다면 잠그는게 맞고 잠그지 않고 소비자는 다른 값이라도 소비만 하면 된다라고 판단한다면 사용하지 않아도 되겠죠.
판단은 프로그래머의 몫입니다.
PS. 14106 질문에 답좀 달아주세요...ㅠ.ㅠ