【问题标题】:Making a directory tree in C in multi-threaded application在多线程应用程序中用 C 语言制作目录树
【发布时间】:2012-07-02 22:01:17
【问题描述】:

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

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

【问题讨论】:

    标签: c multithreading parallel-processing


    【解决方案1】:

    在 libc 中,mkdir 可以设置错误值EEXIST,意思是“那个目录已经存在”。谢谢Jonathan Leffler“只要你告诉编译使事情线程安全,errno 就是线程安全的”。

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

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

    【讨论】:

    • errno 是线程安全的,只要您告诉编译使事情成为线程安全的。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多