我对互斥体的使用还很陌生(只有旧大学课程给出的理论知识很少)。我正在解决有关数据库访问的问题。我现在解释一下我的情况,以便让你更好地了解情况:
存在不同的实体(每个实体在一个不同的线程上产生),称为A,B和C,它们通过名为DB_Manager的单例类在读/写中访问数据库(sqlite3数据库)(具有如此集中的类,管理所有功能)。 由于我正在开发一个在自定义hw上运行的软件,我无法使用C ++ 11(我知道单例模式默认是线程安全的)。我的问题是我不能避免三个实体A,B和C之间的并发。
我已使用getter方法将互斥锁声明为DB_Manager类的成员变量。从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循环中放置了日志打印)然后全部被阻止。我不知道发生了什么。我尝试了在网上找到的所有不同的可能性。
我承认我是并发编程的新手,所以我可能会遗漏一些东西。
答案 0 :(得分:1)
正如@nos所建议的那样,我在互斥锁上删除了,而且一切都没问题了! 新手错误......但幸运的是修复了! 谢谢@nos!