マルチスレッド

複数スレッドから同一データベースを扱う場合は,それぞれのスレッドが sqlite_open より取得された sqlite* を持つ必要がある.
って http://www.sqlite.org/c_interface.html の section 5.0 に書いてありますが,うっかり同じ出自の sqlite* を使ってしまいました.すると見事なまでにエラー続出.幸い,上記サイトを昨日参照したばかりだったので注意事項を思い出すことができた(内容までは覚えていなかったけど…).
で,select 系はいいとして,update や delete, insert が同時に起こるとクエリーはどちらかが止まってしまうことに気づいた(具体的なエラー名はわかりません).
これを回避するために,update 等が必要になる処理は CCriticalSection で囲うことにした.もちろん,検索専用スレッド側の処理もクリティカルセクション内で行う必要がある.まー,update なんかはそうそう頻繁に行われるわけではないので速度的な影響は少ないでしょう.

  • 追記:リンクが消えるかもしれないので引用しておきます.

5.0 Multi-Threading And SQLite
If SQLite is compiled with the THREADSAFE preprocessor macro set to 1, then it is safe to use SQLite from two or more threads of the same process at the same time. But each thread should have its own sqlite* pointer returned from sqlite_open. It is never safe for two or more threads to access the same sqlite* pointer at the same time.