在多线程应用程序中用C制作目录树

在多线程应用程序中用C制作目录树,c,multithreading,parallel-processing,C,Multithreading,Parallel Processing,我的问题是对先前提出的问题的延伸 我需要创建一个目录树,它可能存在,也可能不存在,而且多个线程可以尝试创建这样的目录结构。所引用的问题解决了单线程的问题。该函数是线程安全的还是有任何特定的方法来实现。我使用的是C,操作系统是Ubuntu。在libc中,mkdir可以设置错误值EEXIST,这意味着“该目录已经存在”。感谢“只要您告诉编译使事情成为线程安全的,errno就是线程安全的” 创建目录是单调的-您总是添加新目录,而不是删除它们。因此,您可以创建一个目录树(尝试在每个级别创建每个目录),如

我的问题是对先前提出的问题的延伸


我需要创建一个目录树,它可能存在,也可能不存在,而且多个线程可以尝试创建这样的目录结构。所引用的问题解决了单线程的问题。该函数是线程安全的还是有任何特定的方法来实现。我使用的是
C
,操作系统是Ubuntu。

在libc中,mkdir可以设置错误值
EEXIST
,这意味着“该目录已经存在”。感谢“只要您告诉编译使事情成为线程安全的,errno就是线程安全的”

创建目录是单调的-您总是添加新目录,而不是删除它们。因此,您可以创建一个目录树(尝试在每个级别创建每个目录),如果其他线程先到达,这不是问题,请继续


如果我是你,我会让每个线程递归地创建它的整个路径,忽略错误。完成构建路径后,它应该测试目录是否存在。如果不存在,这就是一个问题(因为用于创建所需路径的
mkdir
操作序列在线程中是同步的)。如果确实存在,恭喜您。

O/S将处理多个线程试图“同时”创建同一目录的问题。至多一个人会成功;另一个将失败,可能是以EISDIR(或者EEXIST)作为错误


交叉引用问题中的代码无法从EISDIR错误中恢复。但是,如果在检查返回代码时发现
errno
是相关错误,则可以决定再试一次。

errno
是线程安全的,只要您告诉编译使其成为线程安全的。