在辅助线程上写SQLite会导致Objective-C中的pthread_kill崩溃吗?

时间:2015-01-12 19:32:25

标签: ios objective-c multithreading sqlite grand-central-dispatch

我有一个奇怪的崩溃,我正在尝试调试,一些帮助将非常感激。

我的主线程如此崩溃:

Thread : Crashed: com.apple.main-thread
0  libsystem_kernel.dylib         0x3316ddfc __pthread_kill + 8
1  libsystem_pthread.dylib        0x331ebd37 pthread_kill + 62
2  libsystem_c.dylib              0x3310d909 abort + 76
3  libc++abi.dylib                0x324389c9 __cxa_bad_cast
4  libc++abi.dylib                0x3244fe29 std::__terminate(void (*)()) + 148
5  libc++abi.dylib                0x3244f8af __cxa_rethrow + 102
6  libobjc.A.dylib                0x32b27dd3 objc_exception_rethrow + 42
7  CoreFoundation                 0x2522245d CFRunLoopRunSpecific + 632
8  CoreFoundation                 0x252221d3 CFRunLoopRunInMode + 106
9  GraphicsServices               0x2c5da0a9 GSEventRunModal + 136
10 UIKit                          0x28831fa1 UIApplicationMain + 1440
11 LifeLock Wallet                0x000e98b1 main (main.mm:21)    

其他线程看起来没问题,直到我看到这个后台线程,我正在生成2048位RSA密钥:

Thread : RSA Key Gen Queue
0  libsystem_kernel.dylib         0x3315c064 fsync + 8
1  MyApp                0x00c697f5 unixSync (sqlite3.c:30624)
2  MyApp                0x00c310f5 syncJournal (sqlite3.c:19113)
3  MyApp                0x00c10d47 sqlite3PagerCommitPhaseOne (sqlite3.c:49218)
4  MyApp                0x00c1101d sqlite3BtreeCommitPhaseOne (sqlite3.c:56943)
5  MyApp                0x00c63107 sqlite3VdbeHalt (sqlite3.c:66150)
6  MyApp                0x00c62bd1 sqlite3VdbeExec (sqlite3.c:70841)
7  MyApp                0x00c11f33 sqlite3_step (sqlite3.c:68643)
8  MyApp                0x00c0cfdf sqlite3_exec (sqlite3.c:98380)
9  MyApp                0x000ee3eb +[DBHelper execStringNormal:] (DBHelper.m:88)
10 MyApp                0x000f448b +[DBHelper insertCategories] (DBHelper.m:1373)
11 MyApp                0x000f34ed +[DBHelper createDB] (DBHelper.m:1147)
12 MyApp                0x000ee97b +[DBHelper initSqlite] (DBHelper.m:212)
13 MyApp                0x000ea245 -[MyApp databaseSetup (MyAppDelegate.m:187)
14 MyApp                0x001fcc69 __37-[Security generateRSAKeyPair]_block_invoke (Security.m:317)
15 libdispatch.dylib              0x330877bb _dispatch_call_block_and_release + 10
16 libdispatch.dylib              0x3308f5b1 _dispatch_queue_drain + 952
17 libdispatch.dylib              0x33089f85 _dispatch_queue_invoke + 84
18 libdispatch.dylib              0x33090b9b _dispatch_root_queue_drain + 338
19 libdispatch.dylib              0x33091cd7 _dispatch_worker_thread3 + 94
20 libsystem_pthread.dylib        0x331e8e31 _pthread_wqthread + 668

由于代码中的一般流程,这引起了我的注意。简而言之:

  1. 在应用启动时创建GCD后台线程,以生成我的RSA密钥。
  2. 创建RSA密钥的类具有一个协议,用于在密钥准备就绪时回调代理(在本例中为我的应用代理)。
  3. 在同一个GCD后台线程上,我回调我的委托对象。
  4. 一旦我的app委托被回调,我打开我的SQLite连接并写入本地数据库。
  5. 我的问题是:

    1. 在后台线程上写入SQLite数据库会导致我的'pthread_kill'崩溃吗?
    2. 是否值得序列化我的SQLite数据库以确保在我有其他线程写入SQLite的情况下,我保持线程安全?
    3. 谢谢!

0 个答案:

没有答案