Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.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
C++ 互斥/多线程/共享资源问题WinAPI_C++_Windows - Fatal编程技术网

C++ 互斥/多线程/共享资源问题WinAPI

C++ 互斥/多线程/共享资源问题WinAPI,c++,windows,C++,Windows,我对多线程知之甚少,但我正在使用其他人的代码,需要一些帮助,因为原来的程序员已经不在了 程序有自己的exe来运行它,但DLL通过APIENTRY(WINAPI)连接到另一个程序的进程。。。当DLL附加到进程时,它会创建一对互斥锁。问题是,其中一个互斥体只应创建一次,并且每个进程都应该可以访问。我似乎无法阻止每个进程创建自己的句柄。至少,在某些操作期间,我需要能够将句柄传递给其他进程,或者从每个进程获取每个句柄并应用相同的操作(基本上是同步一些变量)。我尝试过旧的静态boolisfirst方法,但

我对多线程知之甚少,但我正在使用其他人的代码,需要一些帮助,因为原来的程序员已经不在了

程序有自己的exe来运行它,但DLL通过APIENTRY(WINAPI)连接到另一个程序的进程。。。当DLL附加到进程时,它会创建一对互斥锁。问题是,其中一个互斥体只应创建一次,并且每个进程都应该可以访问。我似乎无法阻止每个进程创建自己的句柄。至少,在某些操作期间,我需要能够将句柄传递给其他进程,或者从每个进程获取每个句柄并应用相同的操作(基本上是同步一些变量)。我尝试过旧的静态boolisfirst方法,但每个过程似乎都创建了一组新的变量,因此无法工作


我真的很困惑和沮丧。如果您有任何想法或想法,我们将不胜感激。

有一个DLL附加机制,每次进程附加时都会调用它(对不起,我记不起确切的名称),另外还有一个InitInstance,在加载DLL时会调用它。因此,如果您使用DLL创建互斥体句柄静态全局变量,在InitInstance中创建并初始化互斥体,并将互斥体句柄分发给任何请求它的进程,您应该做得更好。

似乎创建了单独的DLL实例,导致了单独的数据段。我能够使用data_seg跨实例获得相同值的句柄。我现在意识到我有一个新问题,因为我不能在互斥对象保护的实际变量(对象向量)上使用data_seg来防止同时写入

谢谢,这很有帮助。有没有一种特殊的方法来“分发”互斥句柄?我在DLL中创建了一个静态句柄(我们称之为handle1),并按照您的建议做了,然后使用WaitForSingleObject(handle1,INFINITE)。。。然而,不同的进程似乎使用不同的句柄…所以。只是检查一下,在InitInstance中,您正在调用CreateMutex来创建互斥体并获取句柄,是吗?鉴于此,我将在DLL中创建一个函数GetMutex(){return g_hMutex;},任何其他进程都可以调用该函数。您正在DLL中调用WaitForSingleObject吗?我不明白你为什么要这么做。重要的是,通过WaitForxxxx拥有互斥对象所有权的任何进程都必须调用ReleaseMutex(hand)以允许其他进程获得它。你在这么做吗?我发现InitInstance没有被调用,因为它不是MFC。我将初始化(g_hMutex=CreateMutex(0,0,0);)移到了WinMain中。在DLL中的函数内调用WaitForSingleObject。为什么?我不确定,原来的程序员是这么做的。我想这是因为我们实际上无法控制它所连接的进程(是的,我也被这句话弄糊涂了,哈哈)。正如您所知,WaitForSingleObject会暂停线程,直到它拥有互斥对象的所有权。因此,如果DLL希望以独占方式访问互斥锁保护的数据,则没有理由不使用此选项。只要它在完成后调用ReleaseMutex就可以了。也许您无法控制进程,因为实际上,它们正在连接(附加)DLL…是的,释放互斥在完成后被调用。我可以看到并确认,当两个进程连接时,WinMain只被调用了一次,但它们的行为仍然像以前一样(好像WinMain被调用了两次/被视为两个实例)。