如何以线程安全的方式更改目录?

How can I change directories in a thread safe way?

本文关键字:方式更 线程 安全      更新时间:2023-10-16

>我想生成 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();

但是,这是行不通的。

提升文档显示以下内容:

void current_path(const path&p(;

效果:建立后置条件,仿佛通过 ISO/IEC 9945 chdir((。

后置条件:等价(p, current_path(((。

抛出:如错误报告中指定的那样。

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

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

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

由于 UNIX 进程具有由其所有线程共享的唯一当前目录,因此如果需要不同的current_path,生成进程确实是必需的。 但是,可移植性将受到影响。