thread safe function to create directory in C
我正在实现一个线程安全函数来创建目录,如果它不存在的话。
1 2 3 4 5 6 7 | void create_directory(char *str){ pthread_mutex_lock(mutex); if (stat(str, &st) == -1) { mkdir(str, 0700); } pthread_mutex_unlock(mutex); } |
线程1:
1 | create_directory("dir1"); |
线程2:
1 | create_directory("dir1"); |
线程3:
1 | create_directory("dir2"); |
< BR>线程1和线程2试图创建相同的目录,代码按预期工作。问题是当线程3试图创建另一个目录,即"dir2",它与目录"dir1"无关,那么线程3也会被阻塞。
我想要的是锁定一个目录,而不是锁定一个代码部分。我怎样才能做到这一点。
或者有没有其他方法来实现线程安全函数来创建目录。或者在C中有什么功能可以做到这一点。
为什么不创建目录,如果返回
这是一个等幂运算,所以不必乱弄复杂的锁定方案。尤其是因为它们不会阻止其他进程创建相同的目录。
你可以把你的字符串散列为4位。这将给你16个可能的选择。创建一个由16个互斥体组成的数组,并只获取哈希值所在的锁。碰撞仍然可能发生,但会减少。
您可以将哈希宽度增加到8位,以减少冲突,但您需要更多的互斥对象。
另一种方法是不获取调用mkdir(它调用系统调用)这一代价高昂的部分的锁。
但要维护当前正在创建的目录列表。每个试图创建目录的线程,首先检查该名称是否已经在列表中。如果是,则等待。
如果没有,则输入插入名称并开始创建目录。完成后,它将从列表中删除名称。
只有添加到列表和检查的部分必须由一个简单的锁保护,操作将很快发生。所以在其他目录上运行的其他线程不需要等待太多。
如果您想锁定一个目录,那么只需调用