你好我在C中构建了一个哈希表。我已经对它进行了单元测试,以确保它有效。问题是数据结构将动态链接到我没有编写的代码,并且可能正在使用线程。所以我需要同步它,以便它理论上可以正常工作任意数量的线程同时修改/读取它。在研究了pthread互斥API后,我做了以下
声明了一个静态全局变量:
static pthread_mutex_t lock;
在HashTable_init上(在使用哈希表之前总是调用它)我初始化它:
pthread_mutex_init(&lock,NULL);
在读取/写入结构的每个函数上,我在开始时设置了一个锁:
pthread_mutex_lock(&lock);
并在结束时解锁:
pthread_muter_unlock(&lock);
这足以使数据结构同步吗? (就在我的程序挂起的那一刻)。
谢谢
答案 0 :(得分:2)
这可能还不够。通过锁定每个方法,您可以确保容器的内部结构在任何位置都是一致的;但容器的某些用途可能需要更多。
考虑以下相当简单的情况:在一个线程中,您通过某个键找到了一个项目并开始编辑它。当find()完成时,它会释放锁定,然后返回对项目的引用。同时可以获取锁定,并且另一个线程可能例如删除该项目,对于第一个线程来说非常意外。
设计和开发一个安全可靠的并发容器并非易事。我建议您改为寻找即用型解决方案。
答案 1 :(得分:1)
似乎没问题,只要你确保第一个线程只调用一次init,然后其他线程开始访问互斥锁。