在多线程应用程序中用C创建目录树

时间:2012-07-02 22:01:17

标签: c multithreading parallel-processing

我的问题是之前提出的问题here的扩展。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

O / S将负责尝试在“同时”创建同一目录的多个线程。最多只有一个会成功;另一个会失败,可能是EISDIR(或者可能是EEXIST)的错误。

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