草庐IT

DLL_THREAD_ATTACH

全部标签

c++ - DLL 和编译器设置

许多文章和帖子都警告在链接和使用DLL时可能导致不兼容的编译器设置。如果您在使用C++编写DLL时遵循最佳实践并使用extern“C”导出函数,并且仅使用POD数据类型或坚持使用接口(interface)(纯虚拟)类,那么哪些编译器设置可能会导致问题?您如何知道哪些编译器设置会导致问题?不同的编译器会有不同的设置吗?是否有可用的VisualC++编译器设置列表? 最佳答案 这不是最终的列表,但我记得的事情:链接到不同的运行时,例如链接到主可执行文件中的调试VisualC++运行时,以及链接到要导入的DLL中的发布VisualC++运

c++ - 如何在 C++ 中创建动态 DLL 库,以替代遗留的 Fortran DLL

我必须在C++中创建一个动态DLL库,以替代用Fortran编写的旧DLL库,而无需更改主机应用程序(因此函数和参数必须保持不变)。我有那个库中所有Fortran函数的完整规范,但是我需要使用什么工具(编译器),以及在这种情况下编码DLL的方式是什么(stdcall、cdecl、dllexport等-这些线索没有不用多说,我以前从未创建过DLL)。这是遗留DLL中的示例Fortran函数声明:SUBROUTINESetBoundaries(MaxFlow,MinFlow)cDEC$ATTRIBUTESDLLEXPORT::SetBoundariescDEC$ATTRIBUTESALIA

c++ - 在 C++ 的 .exe 应用程序中包含文件(dll、txt 等)

我制作了一个用C++编写的程序,它使用许多文件,例如.dll或.png。程序和文件在同一目录中。是否可以在.exe应用程序中包含文件?这样我只需要.exe文件就可以运行程序。 最佳答案 啊,是的。答案是在您运行的可执行文件的末尾写入您需要的所有文件,这些文件包含在一个zip文件中。方法如下:Part1(写入可执行文件)和Part2[断开的链接](从可执行文件中读取)。这是有趣的东西;好问题。请注意,您不能对DLL文件执行此操作-它们必须与可执行文件位于同一目录中或安装在计算机上。 关于c

c++ - std::thread 的线程安全数组?

mystruct**=(mystruct**)calloc(10,sizeof(mystruct*);for(unsigndinti=0;i函数new_piece将数据写入mystruct[i]。更具体地说,该函数更改了mystruct[i][0],mystruct[i][1],...,mystruct[9]的值如何让上面的操作线程安全? 最佳答案 正如评论中已经提到的,该代码似乎是“线程安全的”,但它可能会遭受“缓存抖动”的困扰。首先让我解释一下它是什么,以及为什么这可能会在您的代码中发生:什么是缓存抖动:“缓存行”是从内存中提取

java - 检查 jdk/JRE 是否已安装并获取 jvm.dll 的路径

以编程方式,如何检查是否安装了java并从jvm.dll获取路径? 最佳答案 Java可以安装在任何地方,但不能保证您应该能够在什么地方看到。因此,对您的问题的一般回答是“这是不可能的”,或者“您必须在您的计算机上对jvm.dll运行递归文件搜索整个文件系统”。但这不是,你想要的。我认为,您想获得一个“默认”java或jvm,它们将被java工具或任何java软件使用。通常您可以在$JAVA_HOME环境变量(在windows上,%JAVA_HOME%)中找到实际的jdk或jre安装,其中应该包含jvm.dll.如果它不起作用,那是

c++ - std::thread 在 DLLMain 中导致死锁

所以,这就是我要说的:std很复杂。在VS2013中这个简单的程序会导致死锁。#include#includevoidfoo(){}voidinitialize(){std::threadt(foo);}BOOLAPIENTRYDllMain(HMODULE,DWORDreason,LPVOID){switch(reason){caseDLL_PROCESS_ATTACH:initialize();break;caseDLL_THREAD_ATTACH:break;caseDLL_THREAD_DETACH:break;caseDLL_PROCESS_DETACH:break;}ret

c++ - 清理DLL : _endthreadex() vs TerminateThread()中的线程

由于restrictionsonDllMain(我知道这对DLL中的全局和静态对象构造函数和析构函数同样适用),像带异步文件写入/刷新线程的单例记录器这样的简单事情变得太棘手了。单例记录器位于DLL中,并且对可执行文件的加载和卸载时的影响有限。我可以强制该可执行文件在使用前调用它的DLL初始化函数,因此在初始化函数中,我可以使用关键部分来保护一个变量,该变量告诉DLL是否已经初始化或这次是否需要初始化。通过这种方式避免了DllMain的初始化,这将导致死锁,因为我需要从初始化启动线程,并且线程使用DllMain的原因调用DLL_THREAD_ATTACH,并且获得与我们在DllMain

c++ - block 范围内的 thread_local

thread_local变量在block范围内有什么用?如果一个可编译的样本有助于说明问题,这里是:#include#includenamespaceMy{voidf(int*constp){++*p;}}intmain(){thread_localintn{42};std::threadt(My::f,&n);t.join();std::cout输出:43在示例中,新线程获得了它自己的n但(据我所知)不能用它做任何有趣的事情,所以何必呢?新线程自己的n有没有用?如果它没有用,那又有什么意义呢?自然地,我假设是一个点。我只是不知道这有什么意义。这就是我问的原因。如果新线程自己的n想要(

c++ - 无法在 kernel32.dll 中找到过程入口点 InitializeConditionVariable

我正在运行生产者消费者问题(使用windows线程)。它编译成功但在运行时显示以下错误无法在动态库Kernel32.dll中找到过程入口点InitializeConditionVariable。你能说出是什么原因吗 最佳答案 这是一个仅在Vista及更高版本中可用的API函数。我猜你是在XP上运行这段代码。为避免意外使用仅在更高版本的Windows中可用的API函数,您需要定义_WIN32_WINNT宏:#define_WIN32_WINNT0x502//DesignedtorunonWindowsXPSP2andup#includ

c++ - "thread-local storage not supported for this target",适合#ifdef?

由于每个编译器都有自己的线程本地存储版本,我最终为它创建了一个宏。现在唯一的问题是GCC(关闭了pthreads),这给了我:“此目标不支持线程本地存储”很公平,因为在这种情况下pthreads实际上是关闭的。问题是,是否有一种通用的方法可以使用一些宏来检测这一点,例如#ifdef__GCC_XXX_NO_THREADS_XXX?编辑:请参阅下面接受的答案。另外,这是我的懒惰解决方案:$touchtest.c$gcc-E-dMtest.c>out.1$gcc-pthread-E-dMtest.c>out.2$diffout.*28a29>#define_REENTRANT1这是在Mac