boost :: filesystem,std :: getenv和并发

时间:2014-09-02 09:01:57

标签: c++ boost boost-filesystem

假设我有以下代码:

#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();
}

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

  

* 内部程序错误 - 断言(codecvt_facet_ptr())在const类std :: codecvt&amp; __ cdecl中失败   提高::文件系统::路径::的codecvt(无效):   libs \ filesystem \ src \ path.cpp(888):codecvt_facet_ptr()facet hasn&t; t   已正确初始化

documentation我读到它在并行设置和获取操作方面不是线程安全的,而不是像我的情况那样的几个get操作。 _wgetenv函数的工作方式相同。

为什么呢?我做错了什么?

MSVC-12.0,提升1.55,Windows 8

提前致谢。

1 个答案:

答案 0 :(得分:3)

对于某些版本的VS和boost,似乎有关于此的错误报告:例如here

建议在线程之前初始化:

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
}