Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 解决错误R6016-线程数据空间不足 我的静态链接Visual C++ 2012程序偶然产生CRTL错误:“R6016 -线程数据空间不够”。_Windows_Multithreading_Visual C++ 2012 - Fatal编程技术网

Windows 解决错误R6016-线程数据空间不足 我的静态链接Visual C++ 2012程序偶然产生CRTL错误:“R6016 -线程数据空间不够”。

Windows 解决错误R6016-线程数据空间不足 我的静态链接Visual C++ 2012程序偶然产生CRTL错误:“R6016 -线程数据空间不够”。,windows,multithreading,visual-c++-2012,Windows,Multithreading,Visual C++ 2012,微软提供的最低限度的文档称,此错误消息是在生成新线程时生成的,但无法为其分配足够的内存 但是,我的代码只在几个定义良好的情况下显式生成一个新线程,这两种情况在这里都没有发生(当然Microsoft库内部也会生成线程)。一位用户在程序刚刚存在于后台时报告了此问题 不确定它是否相关,但我没有覆盖默认的1MB保留堆栈大小或堆大小,并且我的程序使用的总内存通常非常小(在一个实际内存为12GB的系统上为3MB-10MB,其中一半以上未分配) 这种情况很少发生(因此我无法追踪),而且有多台机器报告过这种情况

微软提供的最低限度的文档称,此错误消息是在生成新线程时生成的,但无法为其分配足够的内存

但是,我的代码只在几个定义良好的情况下显式生成一个新线程,这两种情况在这里都没有发生(当然Microsoft库内部也会生成线程)。一位用户在程序刚刚存在于后台时报告了此问题

不确定它是否相关,但我没有覆盖默认的1MB保留堆栈大小或堆大小,并且我的程序使用的总内存通常非常小(在一个实际内存为12GB的系统上为3MB-10MB,其中一半以上未分配)

这种情况很少发生(因此我无法追踪),而且有多台机器报告过这种情况。我只在Windows8.1上听说过这一点,但我不会对它读太多


是否存在可能影响此错误的编译器设置?还是编程错误?

如果Windows版本为Vista或更高版本,则必须在DllMain中调用TlsAlloc

隐式TLS处理已在Windows Vista中重写[…] threadprivate和_declspec(线程)应在中正常工作 从那时起运行时加载的DLL

BOOL-APIENTRY-DllMain(HINSTANCE-hinstDll,DWORD-fdreason,
LPVOID lpvReserved)
{
静态BOOL fFirstProcess=TRUE;
BOOL fWin32s=FALSE;
DWORD dwVersion=GetVersion();
静态DWORD-dwIndex;

如果(!(dwVersion&0x8000000)和&LOBYTE(LOWORD(dwVersion))这被证明是由调用CreateThread而不是_beginthread引起的。Microsoft文档在备注部分指出,事实上,一旦我们做了更改,我们就再也没有看到该错误了。

我发现该进程是32位的。 在这种情况下,我会增加内存来处理命令

bcdedit/set increaseuserva 3072


胡乱猜测:您是否终止应用程序中的线程?显然,此错误似乎与TLS插槽有关。请参阅,我同意。消息是“线程数据空间不足”,而不是线程(句号)。线程数据是使用TlsAlloc函数系列为线程本地存储分配的空间。此空间非常有限,因此如果您需要存储多个项目,最好创建一个自己的数据结构,并将指向此数据结构的指针存储在TLS中。感谢您的建议,但程序不支持保存所有DLL。
BOOL APIENTRY DllMain(HINSTANCE hinstDll, DWORD fdwReason,
           LPVOID lpvReserved)
   {
       static BOOL fFirstProcess = TRUE;
       BOOL fWin32s = FALSE;
       DWORD dwVersion = GetVersion();
       static DWORD dwIndex;

       if ( !(dwVersion & 0x80000000) && LOBYTE(LOWORD(dwVersion))<4 )
           fWin32s = TRUE;

       if (dwReason == DLL_PROCESS_ATTACH) {
           if (fFirstProcess || !fWin32s) {
               dwIndex = TlsAlloc();
            }
            fFirstProcess = FALSE;
       }

   }