草庐IT

thread-local-storage

全部标签

windows - 线程本地存储/Windows

给定native代码(C/C++),有人可以解释线程本地存储吗?这仅仅是允许线程控制其自身变量生命周期的技巧,还是编译器或硬件实现了一些隔离/保护措施?底层平台重要吗?此外,就上述内容而言,普通TLS和“光纤安全”TLS之间有什么区别?抱歉,我用谷歌搜索,但我能找到的只是如何使用TLS(我已经知道),而不是幕后的极客细节。 最佳答案 线程本地存储(TLS)由操作系统管理。内核中的每个线程对象都包含一个本地TLS槽数组。在运行时,应用程序的代码可以为它需要的每个TLS变量调用TlsAlloc()(例如声明为__thread或__dec

使用 HKEY_LOCAL_MACHINE\Software\WOW6432 节点的 Windows 32 或 64 位

我正在寻找一种非常简单的方法来确定客户使用的Windows版本是32位还是64位。我知道有一些使用.NEt的方法,但我希望避免使用它们。我只是想使用类似于下面伪代码的东西,并想知道这种方法是否可靠。IfRegistryKeyexists(HKEY_LOCAL_MACHINE\Software\WOW6432Node)ThenAssume64bitelseAssume32bit谢谢!编辑:更具体地说,我知道有几种不同的方法可以实现查明操作系统是32位还是64位的目标。但我想知道上面单独的方法是否可靠。 最佳答案 我假设您在32位进程中

windows - C/C++ : duplicate main() loop in many threads

我有这个“有趣”的问题。我有这个遗留代码,看起来像intmain(){while(true){doSomething();}}我想在许多线程中复制doSomething(),这样现在main()看起来像intmain(){runManyThreads(threadEntry)}voidthreadEntry(){while(true){doSomething();}}问题是doSomething()访问许多全局变量和静态变量,我无法更改它的代码。是否有复制这些静态变量的技巧,因此每个线程都有自己的集合?(某种线程本地存储,但不影响doSomething())..我使用VisualC++

c# - 访问 Windows 注册表 LOCAL_MACHINE 中的键

我在HKEY_LOCAL_MACHINE\Software\MyAppName中创建了一个key(使用regedit(我重新启动)),但是当我尝试将它们全部列出时,“MyAppName”没有显示...:(有什么线索吗?rkey=Registry.LocalMachine.OpenSubKey("Software");foreach(stringsubkeyinrkey.GetSubKeyNames()){WriteToLogFile("subkey:"+subkey);} 最佳答案 我将运用我的心理调试能力,并猜测您拥有(a)64位

Java 运行时环境 HKEY_LOCAL_MACHINE 错误

我试图在我的WindowsXP机器上摆脱旧版本的Java(因为我还有1.6和1.7)。很好地卸载1.6我收到有关Java运行时环境的错误。当我尝试启动Java控制面板时,出现以下错误:Thesystemcannotfindtheregistrykeyspecified:HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\JavaRuntimeEnvironment\1.7.0_05我已尝试重新安装Java,但无济于事。而且我无法完全删除Java,因为每当我尝试时它都会给我一个错误,说安装有错误。具体来说:Fatalerrorduringinstallation.知

c++ - 如何销毁由 std::thread 显式创建的线程?

我希望两个线程最初都在无限循环中运行,但过了一段时间我想杀死第一个线程而不等待它完成,第二个线程应该正常运行。我该如何实现?当我运行下面的代码时,出现调试错误!voidf1(inti){while(1){printf("ExecutngThread%d:%d\n",i,j);Sleep(10);}}intmain(){std::threadt1(f1,1);std::threadt2(f1,2);Sleep(100);t1.~thread();while(1){Sleep(10);}return0;} 最佳答案 程序按照设定的控制流

C++ Windows MFC 并发 : Get thread to wait until particular state achieved

在WindowsMFC并发上,我如何告诉我的当前线程等待直到达到特定状态?目前我能想到的唯一方法是执行周期性sleep并检查状态——当我们处于预期状态时,然后继续。有更好的方法吗?BOOLachieved=FALSE;intmain(intargc,char**argv){//Thisfunctioncreatesanewthreadandmodifiesthe'achieved'globalvariableatsomepointinthefuturedoSomethingOnAnotherThread();//Waitmaximum4secondsfor'achieved'tobeT

windows - 帮助 : MS Virtual Disk Service to Access Volumes and Discs on Local Machine

这是我的代码,通过它我成功初始化了VDS服务并获取了包,但是当我在IVdsPack对象上调用QueryVolumes时,我能够获取IEnumVdsObjects但无法通过IEnumVdsObject::Next方法获取IUnknown*数组,它用IUnkown*=NULL返回S_FALSE。所以这个IUnknown*不能用于IVdsVolume的QueryInterface下面是我的代码HRESULThResult;IVdsService*pService=NULL;IVdsServiceLoader*pLoader=NULL;//LaunchtheVDSServicehResult=

Windows 服务应用程序上的 Java5 - 获取 Full Thread Dump 需要说明

我在这里浏览了几篇文章,例如:javastackdumponwindowsThreaddumpprogrammatically/JDI(JavaDebuggerInterface)但没有得到确切的答案。问题:Windows上有一个作为服务运行的Java5应用程序(因此我们没有可以使用Ctrl+Break进行转储的控制台)。有时应用程序挂起,我们需要一个线程转储。我们试过“jstack”但它在我们的环境中不起作用(我们发现它只兼容Java6)。所以我们制作了一个C++应用程序,它通过附加到Java应用程序进程的.dll调用方法调用线程转储,因此它需要本地管理员权限,这不是很好。因此,我们

windows - cmd.exe 返回 "Not enough storage is available to process this command."

...一直在运行Widows7Pro,修改了STARTUP文件夹以运行两个BAT,以创建两个CMD框,一左一右。几天前,在注销时安装了13个Windows7更新,第二天登录时,两个CMD框在命令提示符之前有一条新的错误消息:“没有足够的存储空间来处理这个命令。”在命令提示符下键入“DIR/X”确实会返回目录列表,但会出现三个错误消息:1.系统在应用程序的消息文件中找不到消息号为0x235f的消息文本。2.系统在应用程序的消息文件中找不到消息号为0x235b的消息文本。3.DNS坏键...IE。没有通常的DIR文本注释。现在,在命令行中,任何包含“cmd/k”的BAT文件都会生成具有相同