boost::filesystem、std::getenv和并发性
boost::filesystem, std::getenv and concurrency
假设我有以下代码:
#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
}
相关文章:
- 控制允许动态运行c++的并发操作数
- 节俭并发:未解决的外部问题
- 并发/多线程:是否可以以这种方式生成相同的输出?
- 用于在并发环境中访问 MMIO 的软件模式
- C++中的并发哈希表
- 提升 asio 并发计时器取消问题与链
- C++具有基元类型的并发队列
- C++ getenv and setenv
- 使用简单两相锁定的并发程序
- C++ 按引用或值推送的并发队列
- 允许多个互斥锁所有者或指定数量的并发代码执行
- 琐碎并发代码的吞吐量不会随着线程数量的增加而增加
- 由并发无序映射查找线程调用的函数是否安全?
- 在迭代期间并发修改映射
- 并发安全堆栈接口方法:正确与否?
- 内存模型和并发
- 重塑Microsoft的并发::d iagnostic::span,也可以检测外部跨度
- 如何在 qt 中从另一个线程运行 qt并发时关闭程序
- 如何在 bash 中使用管道在 c++ 中使用 getenv() 访问文件?
- boost::filesystem、std::getenv和并发性