如何以线程安全的方式更改目录?
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_path
即 chdir
不是线程安全的,最后一个更改目录的线程将影响其他线程的全局状态。
它们都将在相同的目录中运行。
但我的选择是什么?基于现有代码,我希望避免在假设当前工作目录不同的情况下重新布线线程逻辑。产卵过程是我唯一的选择吗?
由于 UNIX 进程有一个由其所有线程共享的唯一当前目录,如果您需要 不同的current_path,那么生成一个进程确实是一个要求。
但是,便携性会受到影响。
我想生成 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_path
即 chdir
不是线程安全的,最后一个更改目录的线程将影响其他线程的全局状态。
它们都将在相同的目录中运行。
但我的选择是什么?基于现有代码,我希望避免在假设当前工作目录不同的情况下重新布线线程逻辑。产卵过程是我唯一的选择吗?
由于 UNIX 进程有一个由其所有线程共享的唯一当前目录,如果您需要 不同的current_path,那么生成一个进程确实是一个要求。 但是,便携性会受到影响。