关于多线程:在C中创建目录的线程安全函数

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中有什么功能可以做到这一点。


为什么不创建目录,如果返回EEXIST错误,就忽略它。最终结果是相同的:您调用函数,当它返回时,会有一个目录。

这是一个等幂运算,所以不必乱弄复杂的锁定方案。尤其是因为它们不会阻止其他进程创建相同的目录。


你可以把你的字符串散列为4位。这将给你16个可能的选择。创建一个由16个互斥体组成的数组,并只获取哈希值所在的锁。碰撞仍然可能发生,但会减少。

您可以将哈希宽度增加到8位,以减少冲突,但您需要更多的互斥对象。

另一种方法是不获取调用mkdir(它调用系统调用)这一代价高昂的部分的锁。

但要维护当前正在创建的目录列表。每个试图创建目录的线程,首先检查该名称是否已经在列表中。如果是,则等待。

如果没有,则输入插入名称并开始创建目录。完成后,它将从列表中删除名称。

只有添加到列表和检查的部分必须由一个简单的锁保护,操作将很快发生。所以在其他目录上运行的其他线程不需要等待太多。


如果您想锁定一个目录,那么只需调用mkdir,让操作系统完成它的工作。