【问题标题】:How can I change directories in a thread safe way?如何以线程安全的方式更改目录?
【发布时间】:2020-01-03 06:13:37
【问题描述】:

我想生成 2 个线程并将每个线程移动到不同的工作目录中。

std::thread t1([](){
    boost::filesystem::current_path("/place/one");
    // operate within "place/one"
});

std::thread t2([](){
    boost::filesystem::current_path("/place/two");
    // operate within "place/two"
});

t1.join();
t2.join();

但是,这行不通。

Boost 文档显示如下:

void current_path(const path& p);

效果:建立后置条件,如同通过 ISO/IEC 9945 chdir()。

后置条件:等效(p, current_path())。

抛出:如错误报告中所述。

[注意:许多操作系统的当前路径是危险的 全局状态。它可能会被第三方意外更改或 系统库函数,或由另一个线程。 -- 尾注]

由于current_pathchdir 不是线程安全的,最后一个更改目录的线程会影响另一个线程的全局状态。
它们都将在相同的目录中运行。

但是我的选择是什么?基于现有代码,我希望避免在假设不同的当前工作目录的情况下重新布线线程逻辑。生成进程是我唯一的其他选择吗?

【问题讨论】:

  • 工作目录是程序范围的状态而不是线程特定的状态。不确定线程​​是否可以以某种方式增强以拥有自己的 cwd。
  • 一个进程中的所有线程共享同一个工作目录。你无法改变这一点。所以你需要一个你提出的替代方案。
  • 对于使用绝对路径不起作用的工作目录,您具体需要设置什么?
  • @walnut 需要重写大量代码。我同意绝对路径是理想的,但希望从该代码之外解决。
  • @TrevorHickey 在这种情况下你别无选择。您必须重写代码才能完全停止依赖任何 CWD。这意味着改用绝对路径字符串。咬紧牙关,去做吧。你的代码会更好更安全。

标签: c++ multithreading boost thread-safety chdir


【解决方案1】:

由于 UNIX 进程有一个由所有线程共享的唯一当前目录,如果您需要不同的 current_path,则确实需要生成一个进程。 但是,便携性会受到影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2011-08-05
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多