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

How can I change directories in a thread safe way?

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

Effects: Establishes the postcondition, as if by ISO/IEC 9945 chdir().

Postcondition: equivalent(p, current_path()).

Throws: As specified in Error reporting.

[Note: The current path for many operating systems is a dangerous global state. It may be changed unexpectedly by a third-party or system library functions, or by another thread. -- end note]

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

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

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