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)를 참고해주세요!