오랜만에 엄청난 삽질로 알아낸 새로운 사실 ^^;;
일단 개발중인 프로그램은 멀티쓰레드 형태이고 각 쓰레드가 mysql handler를 생성해서 DB와 통신한다. 지금까지는 각 쓰레드가 자신만의 mysql handler를 가지고 있으니 별도로 동기화를 신경쓰지 않아도 될거라 생각해서 그렇게 프로그래밍을 했다.
그런데 프로그램이 잘 작동하고 종료할때 뻗어버렸다. 그것도 매번 그런게 아니라 어쩌다 한번씩.. 전형적인 멀티쓰레드 프로그램 버그로 이번에는 valgrind도 아무런 에러나 경고 메세지를 보여주지 않았다.
발견한 과정은 너무 길어서 생략하고.. 문제는 mysql_real_connect() 함수가 non thread-safe 함수이다. 이 함수를 thread-safe하게 하려면 mysql을 compile 할 때 별도 옵션을 사용해야 한다. 즉, 기본적으로 non thread-safe이다. 이것은 각 쓰레드가 별도의 mysql handler를 사용하더라도 마찬가지이다.
그 외의 함수들(mysql_query()나 mysql_store_result() 등)은 여러 쓰레드가 하나의 connection을 공유할 경우에는 mutex로 임계영역을 설정해서 동기화를 해줘야 한다. 각 쓰레드가 자신만의 handler를 사용해서 connection을 공유하지 않는다면 아무 문제 없다.
그동안 데몬 프로그래밍만 계속해서 이 문제를 발견하지 못했는데 간만에 커맨드라인 명령어를 만들다가 발견하고 꽤 오래 삽질했다. :-)
관련 정보는 여기서 확인~

comments
comments rss (+댓글 쓰러가기)