boost::filesystem、std::getenv和并发性

boost::filesystem, std::getenv and concurrency

本文关键字:并发 getenv std filesystem boost      更新时间:2023-10-16

假设我有以下代码:

#include <boost/filesystem/path.hpp>
#include <boost/thread.hpp>
void foo()
{
  const boost::filesystem::wpath& appdata_folder = std::getenv("APPDATA");
  while (true)
  {
    boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
  }
}
int main()
{
  boost::thread first(foo);
  boost::thread second(foo);
  first.join();
  second.join();
}

它在运行时失败,并出现以下错误:

*内部程序错误-const类std::codecvt&中的断言(codecvt_facet_ptr())失败__调用约定boost::filesystem::path::codecvt(void):libs\filesystem\src\path.cpp(888):codecvt_facet_ptr()方面没有已正确初始化

在我读到的文档中,就并行集和get操作而言,它不是线程安全的,而不是像我的情况那样的几个get操作_wgetenv函数的工作方式相同。

为什么?我做错了什么?

MSVC-12.0,boost 1.55,Windows 8

提前谢谢。

对于VS和boost的某些版本,似乎有关于这方面的错误报告:例如这里的

建议是在线程之前初始化:

void make_loc(std::locale& loc)
{
    loc = default_locale();
}
int main()
{
    std::locale loc;
    boost::once_flag once;
    boost::call_once(once, boost::bind(&make_loc, boost::ref(loc)));
    //as you were
}