【问题标题】:C Multithreading - Sqlite3 database access by 2 threads crashC多线程 - 2个线程访问Sqlite3数据库崩溃
【发布时间】:2014-10-10 23:58:31
【问题描述】:

这是我的问题的描述:

我的程序中有 2 个线程。一个是主线程,另一个是我使用 pthread_create

创建的

主线程在sqlite3 数据库上执行各种功能。每个函数都会打开以执行所需的操作,并在完成后关闭它。

另一个线程只是在设定的时间间隔后从数据库中读取数据并将其上传到服务器上。该线程还打开和关闭数据库以执行其操作。

当两个线程碰巧打开数据库时,就会出现问题。如果一个先完成,它将关闭数据库,从而导致另一个崩溃,从而使应用程序无法使用。 Main 需要用于每个操作的数据库。

有什么办法可以防止这种情况发生吗?互斥锁是一种方法,但如果我使用互斥锁,它会使我的主线程无用。主线程必须始终保持功能,而其他线程在后台运行。

任何使这项工作的建议都会很棒。 我没有提供 sn-ps,因为这个问题有点太大了,但如果你对这个问题一无所知,请告诉我。

编辑:

static sqlite3 *db = NULL;

打开数据库的代码sn-p

int open_database(char* DB_dir) // argument is the db path
        rc = sqlite3_open(DB_dir , &db); 

        if( rc )                
        {
//failed to open message
            sqlite3_close(db); 
            db = NULL;
            return SDK_SQL_ERR;
        }
        else
        {
            //success message
        }
    }
    return SDK_OK;

}

并关闭数据库

int close_database()
{
    if(db!=NULL)
    {
        sqlite3_close(db);
        db = NULL;
        //success message
    }
    return 1;
}

编辑:我忘了补充一点,后台线程执行一个单一的写入操作,为它上传到服务器的每一行更新表的 1 个字段

【问题讨论】:

  • 为什么它会让你的主线程无用?将其与您现在拥有的进行比较,这是一个可能变得无用的整个程序,甚至可能损坏数据库。
  • 如果我使用互斥锁并且如果第二个线程获得所有权,我的主线程将无法使用数据库,直到后台线程完成并且用户将无法使用主线程函数
  • SQLite 是否不提供从单个进程到数据库的多个并发连接,正是针对线程应用程序?如果是这样,您应该确保主线程和其他线程各自使用自己的数据库连接。如果它没有提供这样的分离,那么你的多开多关设计是错误的——你的多线程设计可能是错误的(你应该真正使用两个单独的进程而不是在一个进程中使用两个线程)。
  • 老实说,我其实没想过要查找并发连接 =) 我会尝试查找相关信息,谢谢

标签: c multithreading sqlite posix shared-resource


【解决方案1】:

让每个线程都使用自己的数据库连接。后台线程没有理由影响主线程的连接。

一般来说,我希望使用连接池,这样我就不会非常频繁地打开和关闭数据库连接;连接打开是一项昂贵的操作。

在应用服务器中,我们经常有很多线程,我们发现一个由几十个连接组成的连接池足以代表数百个用户处理请求。

【讨论】:

  • 老实说,我其实没想过要查找并发连接 =) 我会尝试查找相关信息,谢谢
  • 好的,如果我对带有 sqlite_open_v2 的第二个线程使用不同的连接,我就不能使用 sqlite_close_v2。它不在我的图书馆里吗?
  • 这是一个记录在案的方法。看不出它怎么会丢失。你得问问 sqliite 的人。
  • 我为后台线程使用了不同的连接,但问题是使用 sqlite_close 关闭了此处的连接导致主线程崩溃=(所以问题仍然相同
  • @user3598530 您的sqlite3_close 调用错误。
【解决方案2】:

sqlite3 基本上内置了提供锁定的机制...BEGIN EXCLUSIVE 然后你也可以注册一个睡眠回调,以便其他线程可以做其他事情...

sqlite3_busy_handler()

【讨论】:

    猜你喜欢
    • 2018-08-18
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多