23.8.4.2 C API Threaded Client Program 작성
클라이언트 라이브러리는 대부분 스레드로부터 안전합니다. 가장 큰 문제는 소켓에서 읽을 net.c
의 서브 루틴이 인터럽트 안전 (interrupt-safe)하지 않은 것입니다. 이것은 서버에 긴 읽기를 중단 할 수있는 독자적인 알람을 필요로 할 가능성이 있다는 생각으로 바뀌 었습니다. SIGPIPE
인터럽트의 인터럽트 핸들러를 설치하는 경우 소켓 처리는 스레드로부터 안전해야합니다.
연결 종료시 프로그램의 중단을 방지하기 위해 MySQL은 mysql_library_init()
, mysql_init()
또는 mysql_connect()
에 대한 첫 번째 호출에서 SIGPIPE
를 차단합니다. 자신의 SIGPIPE
핸들러를 사용하려면 우선 mysql_library_init()
를 호출하고 나서 핸들러를 설치합니다.
libmysqlclient
클라이언트 라이브러리에 링크 할 때 "정의되지 않은 기호"오류가 발생하면 많은 경우 이것은 링크 / 컴파일 명령 스레드 라이브러리를 포함하지 않았기 때문입니다.
클라이언트 라이브러리는 연결마다 스레드로부터 안전합니다. 2 개의 스레드에 동일한 연결을 공유 할 수 있지만 다음과 같은 경고를 수반합니다.
여러 스레드가 동일한 연결에서 동시에 MySQL 서버에 쿼리를 보낼 수 없습니다. 특히 하나의 스레드에서
mysql_query()
와mysql_store_result()
의 호출 사이에 다른 스레드가 동일한 연결을 사용하지 않는 것을 확인해야합니다.mysql_query()
와mysql_store_result()
호출 쌍을 상호 배타적 잠금으로 묶어야합니다.mysql_store_result()
가 반환되면 잠금을 해제 할 다른 스레드가 동일한 연결을 쿼리 할 수 있습니다.POSIX 쓰레드를 사용하는 경우
pthread_mutex_lock()
및pthread_mutex_unlock()
를 사용하여 상호 배타적 잠금을 설정하고 해제 할 수 있습니다.많은 스레드는
mysql_store_result()
에 의해 취득되는 다양한 결과 세트에 액세스 할 수 있습니다.mysql_use_result()
를 사용하려면 결과 세트가 닫힐 때까지 동일한 연결을 사용하는 다른 thread가 없는지 확인해야합니다. 그러나 동일한 연결을 공유하는 thread 클라이언트가mysql_store_result()
를 사용하는 것이 실제로 가장 적합합니다.
MySQL 데이터베이스 연결을 생성하고 있지 않지만, MySQL 함수를 호출하는 thread가있는 경우 다음의 것을 알아야합니다.
mysql_init()
를 호출하면, MySQL은 특히 디버그 라이브러리에서 사용되는 쓰레드의 고유의 변수를 만듭니다. 스레드가 mysql_init()
를 호출하기 전에 MySQL 함수를 호출하면 해당 스레드는 필요한 thread 고유 변수가 설정되어 있지 않기 때문에, 조만간 코어 덤프가 생성 될 수 있습니다. 문제를 해결하려면 다음을 수행해야합니다.
다른 모든 MySQL 함수 전에
mysql_library_init()
를 호출합니다. 그것은 스레드로부터 안전하지 않으므로 스레드가 생성되기 전에 그것을 호출하거나 상호 배타 락에 전화를 보호합니다.mysql_thread_init()
이 스레드 핸들러의 MySQL 함수를 호출하기 전에 초기에 호출되도록 조정합니다.mysql_init()
를 호출하면, 자동으로mysql_thread_init()
를 호출합니다.스레드에서
pthread_exit()
를 호출하기 전에mysql_thread_end()
를 호출합니다. 이렇게하면 MySQL 스레드 고유 변수에 의해 사용 된 메모리를 해제합니다.
mysql_init()
에 앞서주의 사항은 mysql_init()
를 호출 mysql_connect()
에도 적용됩니다.