【发布时间】:2017-10-11 07:37:39
【问题描述】:
我正在实现一个线程安全函数来创建目录如果它不存在。
void create_directory(char *str){
pthread_mutex_lock(mutex);
if (stat(str, &st) == -1) {
mkdir(str, 0700);
}
pthread_mutex_unlock(mutex);
}
线程_1:
create_directory("dir1");
线程_2:
create_directory("dir1");
线程_3:
create_directory("dir2");
Thread_1 和 Thread_2 正在尝试创建相同的目录,并且代码按预期工作。问题是当 Thread_3 尝试创建另一个目录,即“dir2”,它与目录“dir1”无关,然后 Thread_3 也被阻塞了。
我想要的是锁定目录而不是锁定代码部分。我怎样才能做到这一点。
或者有没有其他方法可以实现线程安全功能来创建目录。 或者 C 中有什么函数可以做到这一点。
【问题讨论】:
-
如果另一个进程在
stat和mkdir之间创建目录怎么办? -
请注意,使用
stat和mkdir时会出现TOCTOU(检查时间,使用时间)问题。另请注意,stat()可能由于 ENOENT 以外的其他原因而失败,即使名称不是目录,stat()也可能成功。另见Creating a directory tree 和Checking if a directory exists。 -
你是对的,可能会出现TOCTOU问题。由于我在程序的专用目录中创建目录,因此我不希望任何其他进程创建相同的目录。而且,我的进程的所有线程都使用这个函数来创建目录。
标签: c multithreading directory