2011-03-29 95 views
2

你好,我用C语言构建了一个散列表。我已经对单元进行了测试,足以确信它的工作原理。问题是数据结构将被动态链接到我没有编写并且可能正在使用线程的代码。所以我需要对它进行同步,以便理论上可以同时修改/读取任意数量的线程。研究并行线程互斥API后,我做了以下在C中实现同步数据结构

声明静态全局变量:

static pthread_mutex_t lock; 

在HashTable_init(使用哈希表之前,它总是叫)我初始化它:

pthread_mutex_init(&lock,NULL); 

在读取每个函数/写,我把一个锁在启动结构:

pthread_mutex_lock(&lock); 

并在最后解锁:

pthread_muter_unlock(&lock); 

这足以使数据结构同步吗? (因为目前我的程序挂起)。

谢谢

+0

你的互斥量是递归的吗?也许你有一个死锁,因为你试图锁定两次 – 2011-03-29 14:18:34

+0

请确保你在返回错误路径之前解锁互斥锁。 – nos 2011-03-29 14:19:30

回答

2

这可能是不够的。通过锁定每种方法,确保您的容器内部结构在任何时候都是一致的;但容器的一些用途可能需要更多。

请考虑以下相当简单的情况:在一个线程中,您通过某个键找到一个项目并开始编辑它。当find()完成时,它释放锁定,然后返回对项目的引用。与此同时,锁可以被获取,另一个线程可能会例如删除这个项目,意外的是第一个线程。

设计和开发一个好的安全并发容器并不是一件容易的事情。我会建议你,而不是寻找现成的解决方案。

1

看起来不错,但只要你确保init由第一线程和其他线程开始访问互斥体之前调用一次。