【问题标题】:Which threading mode is Sqlite for iOS compiled in?Sqlite for iOS 是在哪种线程模式下编译的?
【发布时间】:2012-02-10 22:30:26
【问题描述】:

页面http://www.sqlite.org/threadsafe.html 提到:

  • 单线程
  • 多线程
  • 序列化

iOS 5中集成的sqlite是在哪种模式下编译的?

【问题讨论】:

    标签: ios multithreading sqlite ios5


    【解决方案1】:

    好的,所以 sqlite3_threadsafe() 返回 2,所以它在 iOS 上使用 SQLITE_CONFIG_MULTITHREAD 编译。不幸的是,我本来希望序列化的。

    sqlite3_config(SQLITE_CONFIG_SERIALIZED) 不幸地给了我 SQLITE_MISUSE

    【讨论】:

    • 尝试用全互斥量打开数据库连接:sqlite3_open_v2(sqliteFilePath, &sqlite, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_FULLMUTEX, NULL);
    【解决方案2】:

    根据这个答案 - https://stackoverflow.com/a/7799021/40444

    看来您可以执行以下操作:

    sqlite3_shutdown();
    if (sqlite3_config(SQLITE_CONFIG_SERIALIZED) == SQLITE_OK) {
        NSLog(@"sqlite configured to be threadsafe);
    }
    sqlite3_initialize();
    

    但目前尚不清楚这是否正式有效。

    【讨论】:

    • 不幸的是,在应用设置后记录 sqlite3_threadsafe() 并没有显示任何差异...
    【解决方案3】:

    答案是多线程。 我们可以使用 sqlite3_threadsafe() 来检查,它返回 2。

    0 - Single-thread
    2 - Multi-thread
    1 - Serialized
    

    问:@Ben Marten “不幸的是,记录 sqlite3_threadsafe() 没有显示任何 应用设置后的差异..."

    A: sqlite3_threadsafe() 仅报告编译时互斥锁设置 [SQLITE_THREADSAFE] 标志。

    sqlite3_threadsafe()接口的返回值确定 由编译时线程模式选择。如果单线程模式是 在编译时选择,然后 sqlite3_threadsafe() 返回 false。如果 选择多线程或序列化模式,然后 sqlite3_threadsafe() 返回真。 sqlite3_threadsafe() 接口 早于多线程模式以及启动时和运行时模式 selection 等无法区分多线程和 序列化模式也不能报告开始时间或运行时间模式 变化。

    【讨论】:

      猜你喜欢
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多