在Windows 10 / VS2015上为STXXL 1.4.1。
我有一些代码实际上是在其中使用的:
typedef stxxl::vector<RC, 4, stxxl::lru_pager<8>, 2 * 1024> TVector;
typedef stxxl::deque<RC, TVector> CellIndexList;
这是为了将块大小从默认值2 * 1024 * 1024减小;我必须这样做,因为我有
std::vector<CellIndexList> list(400);
并且由于默认的stxxl :: vector分配了约60MB的缓冲区,因此我的向量中有60 * 400 MB的内存,该内存因bad_alloc(32位)而崩溃-因此,这就是我进入当前设置的方式。
以此为背景,我现在遇到的是我的代码因以下stxxl诊断而崩溃:
[STXXL-ERRMSG] Exception thrown in ~vector()
当我向stxxl :: vector ::〜vector()添加一些其他诊断程序时,我得到以下信息:
Dynamic exception type: class std::system_error
std::exception::what: resource unavailable try again: resource unavailable try again
因此,stxxl :: vector析构函数中的flush()失败,出现此异常;从谷歌搜索看来,此异常意味着已达到最大线程数。
现在我正在努力理解为什么在进行flush()时为什么会创建额外的线程。我查看了stxxl源代码,发现了一些关于不同类型磁盘队列的提及,并且我还尝试在define.h中启用STXXL_HACK_SINGLE_IO_THREAD,但是所有这些都只是在尝试随机操作,因为我缺乏概述stxxl在什么目的和什么情况下创建多少个线程。
我也尝试过提出一个独立的问题,该问题会出现此问题,但失败了;我可以轻松做到
std::vector<CellIndexList> d(10000);
并为它们填充大量数据而不会出现问题。因此,对于在我的实际代码中使用导致问题的线程的方式,必须有一些具体说明。太大了,无法开始解决问题,直到我解决问题为止。
所以,我的问题是:stxxl中是否有任何地方可能在创建大量线程?我还能在这里找到其他问题吗?