C++ pthread_mutex 在数据库访问上没有按预期工作
C++ pthread_mutex does not work as expected on db access
我对互斥体的使用很陌生(旧大学课程只提供薄弱的理论知识)。我正在处理有关数据库访问的问题。我现在解释一下我的情况,以便您更好地了解情况:
存在称为 A、B 和 C 的不同实体(每个实体都在不同的线程上产生),它们通过名为 class 的单例访问 read/write 中的数据库(sqlite3 数据库) DB_Manager(有一个管理所有功能的集中 class)。
因为我正在开发一个在自定义硬件上运行的软件,所以我无法使用 C++11(我知道单例模式默认情况下是线程安全的)。我的问题是我无法避免三个实体 A、B 和 C 之间的并发。
我已经用getter方法将互斥量声明为DB_Managerclass的成员变量。从 A、B 和 C 开始,每当出现关键代码区域时,我将执行以下操作:
lock_db=DB_Manager->getMutex();
while(pthread_mutex_lock(lock_db) < 0)
{
//loop in order to wait the release of the mutex because has being locked by someone else
}
//here, the mutex has been succesfully locked
//HERE RESIDE THE CRITICAL PART OF CODE
pthread_mutex_unlock(lock_db); //release the mutex
A、B 和 C 实体代码的每个关键部分都复制了此行为。
一次 运行,每个都执行一个 while 循环(我知道这一点是因为我在 while 循环中放置了日志打印),然后全部被阻止。我不知道发生了什么。我尝试了在网上找到的所有不同的可能性。
我承认我是并发编程的新手,所以我可能会遗漏一些东西。
正如@nos 所建议的,我删除了互斥锁上的 while,然后一切都好了!
新手错误...但幸运的是修复了!
谢谢@nos!
我对互斥体的使用很陌生(旧大学课程只提供薄弱的理论知识)。我正在处理有关数据库访问的问题。我现在解释一下我的情况,以便您更好地了解情况:
存在称为 A、B 和 C 的不同实体(每个实体都在不同的线程上产生),它们通过名为 class 的单例访问 read/write 中的数据库(sqlite3 数据库) DB_Manager(有一个管理所有功能的集中 class)。 因为我正在开发一个在自定义硬件上运行的软件,所以我无法使用 C++11(我知道单例模式默认情况下是线程安全的)。我的问题是我无法避免三个实体 A、B 和 C 之间的并发。
我已经用getter方法将互斥量声明为DB_Managerclass的成员变量。从 A、B 和 C 开始,每当出现关键代码区域时,我将执行以下操作:
lock_db=DB_Manager->getMutex();
while(pthread_mutex_lock(lock_db) < 0)
{
//loop in order to wait the release of the mutex because has being locked by someone else
}
//here, the mutex has been succesfully locked
//HERE RESIDE THE CRITICAL PART OF CODE
pthread_mutex_unlock(lock_db); //release the mutex
A、B 和 C 实体代码的每个关键部分都复制了此行为。
一次 运行,每个都执行一个 while 循环(我知道这一点是因为我在 while 循环中放置了日志打印),然后全部被阻止。我不知道发生了什么。我尝试了在网上找到的所有不同的可能性。
我承认我是并发编程的新手,所以我可能会遗漏一些东西。
正如@nos 所建议的,我删除了互斥锁上的 while,然后一切都好了! 新手错误...但幸运的是修复了! 谢谢@nos!