当前位置:首页 > 芯闻号 > 充电吧
[导读]作者:朱金灿来源:http://blog.csdn.net/clever101            在并发访问sqlite数据库会出现这样一个错误:databseis locked,这是sqlite

作者:朱金灿

来源:http://blog.csdn.net/clever101

   

        在并发访问sqlite数据库会出现这样一个错误:databseis locked,这是sqlite数据库对并发支持不太好的缘故造成的。采用网上的一种的思路是通过互斥信号量来达到并发访问的目的。下面是一个跨平台的互斥信号量类:


//ProcessMutex.h文件: 
#ifndef __PROCESS_MUTEX_H__
#define __PROCESS_MUTEX_H__
 
#if defined _WIN32 || defined _WIN64

     #include 

#endif
 
#ifdef linux
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#endif
 
class CProcessMutex
{
public:
    /* 默认创建匿名的互斥 */
    CProcessMutex(const char* name = NULL);
    ~CProcessMutex();
 
    bool Lock();
    bool UnLock();
private:

#if defined _WIN32 || defined _WIN64

    void* m_pMutex;

#endif

#ifdef linux
    set_t* m_pSem;
#ednif
    char m_cMutexName[30];
};
#endif

 //ProcessMutex.cpp文件:
#include "ProcessMutex.h"
 
#if defined _WIN32 || defined _WIN64
 
CProcessMutex::CProcessMutex(const char* name)
{
    memset(m_cMutexName, 0 ,sizeof(m_cMutexName));
    int min = strlen(name)>(sizeof(m_cMutexName)-1)?(sizeof(m_cMutexName)-1):strlen(name);
    strncpy(m_cMutexName, name, min);
    m_pMutex = CreateMutex(NULL, false, m_cMutexName);
}
 
CProcessMutex::~CProcessMutex()
{
    CloseHandle(m_pMutex);
}
 
bool CProcessMutex::Lock()
{
    //互斥锁创建失败
    if (NULL == m_pMutex)
    {
        return false;
    }
     
    DWORD nRet = WaitForSingleObject(m_pMutex, INFINITE);
    if (nRet != WAIT_OBJECT_0)
    {
        return false;
    }
 
    return true;
}
 
bool CProcessMutex::UnLock()
{
    return ReleaseMutex(m_pMutex);
}
 
#endif
 
#ifdef linux
 
CProcessMutex::CProcessMutex(const char* name)
{
    memset(m_cMutexName, 0 ,sizeof(m_cMutexName));
    int min = strlen(name)>(sizeof(m_cMutexName)-1)?(sizeof(m_cMutexName)-1):strlen(name);
    strncpy(m_cMutexName, name, min);
    m_pSem = sem_open(name, O_CREAT, 0644, 1);
}
 
CProcessMutex::~CProcessMutex()
{
    int ret = sem_close(m_pSem);
    if (0 != ret)
    {
        printf("sem_close error %dn", ret);
    }
    sem_unlink(m_cMutexName);
}
 
bool CProcessMutex::Lock()
{
    int ret = sem_wait(m_pSem);
    if (ret != 0)
    {
        return false;
    }
    return true;
}
 
bool CProcessMutex::UnLock()
{
    int ret = sem_post(m_pSem);
    if (ret != 0)
    {
        return false;
    }
    return true;
}
 
#endif

使用示例代码如下:

CProcessMutex pMutex("MutexName");

pMutex.Lock();

sqlite3_exec( myconn, sql, 0, 0, &m_sqlerr_msg); // 执行sqlite的相关操作

pMutex.UnLock();

参考文献:

 

1. 多进程之间的互斥信号量的实现(Linux和windows跨平台)

 

2.sqlite遇到database is locked问题的完美解决

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

  医疗解决方案目的的临界性是免除干扰影响的重要因素。虽然无线局域网络、蓝牙低功耗技术等无线接口本身可用于较大规模的网络运作,而且该项低功耗技术能改善原本蓝牙技术所采用的多项组件,然而,装置操作环境中

关键字: Android 数据库 游戏开发 sqlite

作为针对Red Hat Enterprise Linux的最后一步,Fedora的Red Hat开发人员计划将以前使用的Berkeley DB RPM数据库(RPMDB)切换到SQLite。

关键字: berkeley Linux sqlite rpm数据库

原文转载于:https://www.cnblogs.com/5211314jackrose/p/5816066.html1、异步I/O模式    通常,当SQLite写一个数据库文件时,会等待,直到写

关键字: sqlite

Singleton 单例模式,又叫单子模式,是一种常见的软件设计模式。这种模式的特点就是应用了 Singleton 单例模式的类必须保证始终只有一个实例(对象)存在。许多时候系统中需要某个类只能同时存

关键字: sqlite

    今天在Qt for Android跑离线数据,要使用到Sqlite数据库,当时是在pc端跑过了的,一切流程都很ok了,所以就准备转移到安卓设备上面试一试,发现刚运行初始化Sqlite时就出现了

关键字: qml sqlite localstorage

* 从 http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki 下载了 sqlite-netFx35-setup-b

关键字: c# sqlite

SQLite 日期类型(转)SQLite日期类型简单示例:SELECT     datetime(CHANGE_DATE,'localtime'),     strftime('%Y-%m-%d',C

关键字: sqlite 日期类型

SQLite说C语言好,到底好在哪里?

关键字: C语言 sqlite

打开sqlite数据库需要用到sqlite3_open函数,但是sqlite3_open函数的第一个参数是数据库文件的绝对路径。它是有讲究的,必须是utf8字符串。也就是说假如文件路径是非utf8字符

关键字: sqlite

目录(?)[+]一、初识sqlite         偶然的机会接触到sqlite,不禁惊叹sqlite的体型小巧而功能强大(看来软件也不可貌相哦),Sqlite 是开源的内存数据库(也可以称之为内嵌

关键字: sqlite 数据库建立
关闭
关闭