【发布时间】: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_path 即chdir 不是线程安全的,最后一个更改目录的线程会影响另一个线程的全局状态。
它们都将在相同的目录中运行。
但是我的选择是什么?基于现有代码,我希望避免在假设不同的当前工作目录的情况下重新布线线程逻辑。生成进程是我唯一的其他选择吗?
【问题讨论】:
-
工作目录是程序范围的状态而不是线程特定的状态。不确定线程是否可以以某种方式增强以拥有自己的 cwd。
-
一个进程中的所有线程共享同一个工作目录。你无法改变这一点。所以你需要一个你提出的替代方案。
-
对于使用绝对路径不起作用的工作目录,您具体需要设置什么?
-
@walnut 需要重写大量代码。我同意绝对路径是理想的,但希望从该代码之外解决。
-
@TrevorHickey 在这种情况下你别无选择。您必须重写代码才能完全停止依赖任何 CWD。这意味着改用绝对路径字符串。咬紧牙关,去做吧。你的代码会更好更安全。
标签: c++ multithreading boost thread-safety chdir