2012-07-02 20 views
0

我的问题是对先前问here问题的扩展。在C中的多线程应用程序中制作一个目录树

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

+0

什么操作系统? – Joe

+0

我编辑了这个问题。 –

回答

1

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

创建目录是单调的 - 你总是添加新的目录,而不是删除它们。所以你可以创建一个目录树(试图在每个级别创建每个目录),如果其他线程首先到达那里,这不是问题,继续下去。

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

+0

只要您告诉编译使线程安全,'errno'就是线程安全的。 –

+0

很酷。我会更新我的答案。 – Joe

0

操作系统将处理多个线程,试图在“同一时间”创建相同的目录。至多一个人会成功;另一个会失败,可能是EISDIR(或者EEXIST)作为错误。

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