Message Queue, DLL(so), MySQL DB 사용시 Thread 동기화 사용 여부 문의
글쓴이: markman / 작성시간: 수, 2013/01/09 - 3:00오전
안녕하세요.
CentOS에서 프로그램을 만들고 있는데
main thread가 message queue로 수신받은 데이터를 버퍼에 집어넣으면
각 child thread들은 버퍼에 데이터를 꺼내와서 처리하는 구조입니다.
둘다 while문에 usleep(50000)을 지정하였습니다.
전역변수는 가급적 사용하지 않았고 사용하더라도 해당 child thread의 index로 구분을 하였습니다.
여러개의 child thread들은 공통적으로 Message queue send함수, DLL에서 명시적으로 호출한 함수 및
MySQL DB set/get함수를 사용합니다.
이런 경우 위의 함수를 사용하는 부분을 모두 pthread_mutex_lock() 및 pthread_mutex_unlock()
처리 해주는 것이 맞습니까?
mutex 사용을 많이 하면 성능저하가 발생할 것 같은데 위와 같은 경우에는 어떻해야할지 잘 모르겠습니다.
Forums:
1) 쓰레드들 간에 공유하는 변수가 있는가? 2)
1) 쓰레드들 간에 공유하는 변수가 있는가?
2) 차일드 쓰레드들이(공통으로 사용한 코드) 사용한 메시지큐(또는 임의의 함수/라이브러리)가 쓰레드세이프(threadsafe)하지 않은가?
위 두가지를 검토하시고, 둘 중 하나라도 '예'가 나온다면 반드시 동기화(위의 뮤텍스 등과 같은 처리)가 필요합니다.
* 쓰레드세이프에 대해 모르신다면, 이에 대해서는 만사 제쳐 놓고 심도있게 봐야합니다.(쓰레드를 이용하고자 하는 경우)
* 커널(운영체제)가 제공하는 시스템호출은 쓰레드세이프합니다. 단, 사용자 영역에서 제공하는 래퍼(wrapper)나 라이브러리의 경우는 그렇지 않은 경우가 종종 있습니다.
* 말씀하신대로 뮤텍스등 동기화를 위한 시스템 호출의 남발은 성능저하의 원인이 되므로, 뮤텍스 때문에 성능이 우려된다면, 뮤텍스를 최대한 회피하는 프로그램 설계 및 구현이 필요합니다.
* usleep(), sleep()등을 이용해서 타이밍을 맞추려고 하는 시도는, 하드웨어 및 이의 제어부(임베디드 운영체제 등)가 고정된 경우 일지라도 절대 사용하지 말것을 권고합니다. 이상한 오동작("어제까지 잘~ 돌았는데....") , 자원 낭비 및 저성능을 초래할 수 있습니다.
자세한 답변 감사드립니다.
1) 쓰레드들 간에 공유하는 변수는 전역 struct 변수가 있는데 각 쓰레드들이 자기 것만 사용하고 있습니다.
예를 들어, Thread#1은 array[1], Thread#2은 array[2] 이런식으로요. 일종의 TSD라고 보면 되겠습니다
2) MySQL 함수인 mysql_query(), mysql_store_result(), mysql_fetch_row()는 wrapper 함수라고 봐야겠군요.
Message Queue는 시스템 호출이므로 thread-safe하다고 봐야되나요?
3) 쓰래드들이 쓰는 함수는 로컬변수만을 사용하도록 (reentrant) 하였습니다.
다만 DLL 함수들을 보니 전역변수를 사용하고 있어서 이 함수들을 사용하는 부분은 mutex 처리하였습니다.
4) usleep()를 사용하지 않으면 loop문이 시스템 자원을 계속 잡고 있어서 느려집니다.
타이밍을 맞출려는 목적은 아니고 어느 한 thread(Main thread 포함)가 자원을 계속 잡아먹지 않게
할려고 사용하였습니다.
이런경우 만약 sleep()/usleep()를 사용하지 않는다면 어떤 방법으로 처리해야 하나요?
댓글 달기