>  기사  >  백엔드 개발  >  SQLite 멀티스레딩 사용에 대한 심층 요약

SQLite 멀티스레딩 사용에 대한 심층 요약

黄舟
黄舟원래의
2016-12-19 14:43:012047검색

SQLite는 3가지 스레드 모드를 지원합니다.
단일 스레드: 이 모드에서는 상호 배제가 없으며 멀티스레딩은 안전하지 않습니다. 모든 뮤텍스 잠금을 비활성화하며 동시에 사용하면 오류가 발생합니다. SQLite를 컴파일할 때 SQLITE_THREADSAFE=0 매개변수를 추가하거나 SQLite를 초기화하기 전에 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD)를 호출하면 활성화됩니다.

멀티스레딩: 이 모드에서는 여러 스레드가 동시에 사용하지 않는 한 데이터베이스 연결이 안전합니다. 소스 코드에서는 bCoreMutex가 활성화되고 bFullMutex가 비활성화됩니다. 실제로는 데이터베이스 연결을 비활성화하고 준비하는 것입니다. 문(준비된 문)에 잠금을 설정하여 동일한 데이터베이스 연결 또는 준비를 여러 스레드에서 동시에 사용할 수 없습니다. 성명. SQLite가 컴파일될 때 SQLITE_THREADSAFE=2 매개변수가 추가되면 기본적으로 활성화됩니다. SQLITE_THREADSAFE가 0이 아닌 경우 SQLite를 초기화하기 전에 sqlite3_config(SQLITE_CONFIG_MULTITHREAD)를 호출하여 활성화하거나 데이터베이스 연결을 생성할 때 SQLITE_OPEN_NOMUTEX를 설정할 수 있습니다. 깃발.

직렬: SQLite는 스레드로부터 안전합니다. bCoreMutex 및 bFullMutex를 포함한 모든 잠금을 활성화합니다. . 데이터베이스 연결 및 준비가 되어있기 때문에 문은 모두 잠겨 있으므로 여러 스레드가 이러한 개체를 사용할 때 동시에 사용할 수 없으며 직렬이 됩니다. SQLite_THREADSAFE는 SQLite가 컴파일될 때 추가됩니다. =1 매개변수는 기본적으로 활성화됩니다. SQLITE_THREADSAFE가 0이 아닌 경우 SQLite를 초기화하기 전에 sqlite3_config(SQLITE_CONFIG_SERIALIZED)를 호출하여 활성화하거나 데이터베이스 연결을 생성할 때 SQLITE_OPEN_FULLMUTEX를 설정할 수 있습니다. 깃발 .

여기서 언급하는 초기화는 sqlite3_initialize() 함수를 호출하는 것을 의미하며, 이 함수는 sqlite3_open()을 호출할 때 자동으로 호출되며

스레드로부터 안전하려면 SQLite는 컴파일할 때 SQLITE_THREADSAFE 전처리 매크로를 1로 설정해야 합니다. 윈도우와 리눅스에서는 이것은 잘 컴파일된 바이너리 배포판의 설정입니다. 사용 중인 라이브러리가 스레드로부터 안전한지 확실하지 않은 경우 sqlite3_threadsafe() 인터페이스를 호출하여 확인할 수 있습니다. 컴파일 타임 SQLITE_THREADSAFE 매개변수를 얻으려면 sqlite3_threadsafe()를 호출하세요.

즉, 스레드 모드는 컴파일 타임(SQLite 라이브러리가 소스 코드에서 컴파일될 때), 시작 시(SQLite를 사용하는 애플리케이션이 초기화될 때) 또는 런타임(데이터베이스 연결이 생성될 때)에 지정할 수 있습니다. 일반적으로 런타임에 지정된 모드는 시작 시 지정된 모드를 재정의하고, 시작 시 지정된 모드는 컴파일 시 지정된 모드를 재정의합니다. 그러나 단일 스레드 모드가 지정되면 재정의할 수 없습니다. 기본 스레드 모드는 직렬 모드입니다.

컴파일 시 스레드 모드 선택
SQLITE_THREADSAFE 매크로를 정의하여 스레드 모드를 지정할 수 있습니다. 지정하지 않으면 기본값은 직렬 모드입니다. 직렬 모드 사용을 지정하려면 SQLITE_THREADSAFE=1 매크로를 정의하고, 단일 스레드 모드를 사용하려면 0을, 다중 스레드 모드를 사용하려면 2를 정의합니다.

sqlite3_threadsafe() 함수의 반환 값은 컴파일 타임에 지정된 스레드 모드를 결정할 수 있습니다. 단일 스레드 모드가 지정된 경우 함수는 false를 반환합니다. 직렬 또는 다중 스레드 모드가 지정된 경우 함수는 true를 반환합니다. sqlite3_threadsafe() 함수는 멀티 스레드 모드보다 우선하고 시작 및 런타임 시 모드 선택을 수행하므로 멀티 스레드 모드와 직렬 모드 또는 시작 및 런타임 모드를 구분할 수 없습니다.

마지막 문장은 sqlite3_threadsafe 함수 SQLITE_API int의 구현을 통해 이해할 수 있습니다. sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; } 컴파일 시 단일 스레드 모드가 지정되면 중요한 뮤텍스 논리가 생성 시 생략되므로 시작 또는 런타임 시 직렬 모드 또는 다중 스레드 모드를 지정할 수 없습니다.

시작 시 스레드 모드 선택
컴파일 시 단일 스레드 모드가 지정되지 않은 경우 sqlite3_config() 함수를 사용하여 애플리케이션 초기화 중에 스레드 모드를 수정할 수 있습니다. 매개 변수 SQLITE_CONFIG_SINGLETHREAD는
단일 스레드 모드로, SQLITE_CONFIG_MULTITHREAD는 다중 스레드 모드로, SQLITE_CONFIG_SERIALIZED는 직렬 모드로 지정할 수 있습니다.

런타임 시 스레드 모드 선택
컴파일 시 또는 시작 시 단일 스레드 모드를 지정하지 않으면 각 데이터베이스 연결을 생성할 때 다중 스레드 모드 또는 직렬 모드로 개별적으로 지정할 수 있습니다. 단일 스레드 모드로 지정됩니다. 컴파일 시 또는 시작 시 단일 스레드 모드가 지정된 경우 연결을 생성할 때 다중 스레드 또는 직렬 모드를 지정할 수 없습니다.

연결을 생성할 때 스레드 모드를 지정하려면 sqlite3_open_v2() 함수의 세 번째 매개변수를 사용하십시오. SQLITE_OPEN_NOMUTEX는 다중 스레드 모드에서 생성된 연결을 식별합니다. SQLITE_OPEN_FULLMUTEX는 직렬 모드에서 생성된 연결을 식별합니다. 식별자가 지정되지 않거나 sqlite3_open() 또는 sqlite3_open16() 함수를 사용하여 데이터베이스 연결을 생성하는 경우 컴파일 시간이나 시작 시간에 지정된 스레드 모드가 기본 스레드 모드로 사용됩니다.

위 내용은 SQLite 멀티스레딩 사용에 대한 심층 요약입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.