进程间在0到255之间的唯一数字
Unique number between 0 to 255 across the processes
是否有办法生成0到255之间唯一的数字?这个数字在各个进程中必须是唯一的。因此,如果我的应用程序有多个实例,每个实例将获得一个在0到255之间的唯一数字。当然,我的应用程序最多可以有256个实例。
正如Brad建议的那样,使用文件总是一个选项。但我想知道是否有任何windows API这样做?
这是我可以在c++中做的吗?
在Windows上,您可以在DLL中创建共享内存或共享数据段。由于您正在共享来自单个DLL的单个整数,因此使用共享数据段可能会更简单。
#pragma data_seg (".myseg")
int sharedCounter = 0;
#pragma data_seg()
你需要使用一个互锁函数来访问它,因为它是跨进程共享的:
int myAppId = InterlockedIncrement(&sharedCounter);
正如其他人建议的,您可以使用共享内存在进程之间交换数据。
因为您只对0-255之间的唯一ID感兴趣,并且我假设任何给定的ID在进程使用它之后都可以被重用(因此256个并发进程之间的唯一ID,对吗?)如果是这样,您可以在共享内存中存储一个包含256个元素的布尔数组,当一个新进程加载DLL时,它可以在数组中查找一个可用的插槽,将其设置为true,并使用插槽索引作为它的唯一ID。卸载DLL时,让它将数组槽重置为false,以供以后的进程使用。您可以通过CreateMutex()
使用命名互斥锁来同步跨进程对数组的访问。
像这样:
#pragma data_seg (".myseg")
bool AppsInUse[256] = {0};
#pragma data_seg()
HANDLE hMutex = NULL;
int UniqueID = -1;
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hinstDLL);
hMutex = CreateMutex(NULL, FALSE, TEXT("MyMutex"));
if (hMutex == NULL)
return FALSE;
if (WaitForSingleObject(hMutex, 5000) == WAIT_OBJECT_0)
{
for (int i = 0; i < 256; ++i)
{
if (!AppsInUse[i])
{
AppsInUse[i] = true;
UniqueID = i;
break;
}
}
ReleaseMutex(hMutex);
}
if (UniqueID == -1)
return FALSE;
break;
case DLL_PROCESS_DETACH:
if (UniqueID != -1)
{
if (WaitForSingleObject(hMutex, 1000) == WAIT_OBJECT_0)
{
AppsInUse[UniqueID] = false;
ReleaseMutex(hMutex);
}
UniqueID = -1;
}
if (hMutex != NULL)
{
CloseHandle(hMutex);
hMutex = NULL;
}
break;
}
return TRUE;
}
如果你的编译器不支持#pragma data_seg
,你可以使用CreateFileMapping()
和MapViewOfFile()
来动态分配共享数组:
HANDLE hMapping = NULL;
bool* AppsInUse = NULL;
HANDLE hMutex = NULL;
int UniqueID = -1;
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
{
DisableThreadLibraryCalls(hinstDLL);
hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(bool) * 256, TEXT("MyArray"));
if (hMapping == NULL)
return FALSE;
bool bDoInit = (GetLastError() != ERROR_ALREADY_EXISTS);
AppsInUse = (bool*) MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, sizeof(bool) * 256);
if (AppsInUse == NULL)
return FALSE;
if (bDoInit) ZeroMemory(AppsInUse, sizeof(bool) * 256);
hMutex = CreateMutex(NULL, FALSE, TEXT("MyMutex"));
if (hMutex == NULL)
return FALSE;
if (WaitForSingleObject(hMutex, 5000) == WAIT_OBJECT_0)
{
for (int i = 0; i < 256; ++i)
{
if (!AppsInUse[i])
{
AppsInUse[i] = true;
UniqueID = i;
break;
}
}
ReleaseMutex(hMutex);
}
if (UniqueID == -1)
return FALSE;
break;
}
case DLL_PROCESS_DETACH:
if (UniqueID != -1)
{
if (WaitForSingleObject(hMutex, 1000) == WAIT_OBJECT_0)
{
AppsInUse[UniqueID] = false;
ReleaseMutex(hMutex);
}
UniqueID = -1;
}
if (AppsInUse != NULL)
{
UnmapViewOfFile(AppsInUse);
AppsInUse = NULL;
}
if (hMapping != NULL)
{
CloseHandle(hMapping);
hMapping = NULL;
}
if (hMutex != NULL)
{
CloseHandle(hMutex);
hMutex = NULL;
}
break;
}
return TRUE;
}
不是由c++结构指定的。但是,您可以将当前的数字保存在一个文件中,当进程启动时,您可以读取该文件并增加该数字。您需要对文件进行锁定,这样两个进程就不会同时更新它。你还需要一种方法来检测一个进程,如果它是同类中唯一的一个,并重新开始。
如何实现这两个最后的要求可能会被证明是特定于你的语言和操作系统。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 何时在引用或唯一指针上使用移动语义
- 在cuda线程之间共享大量常量数据
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 计算排序向量的向量中唯一值的计数
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 为什么两个相同的代码给出不同的输出,而它们之间的唯一区别是不同的变量名称和写作样式
- 在文本中的两个非唯一字符串之间获取子弦
- C++数据结构,用于存储两组唯一元素之间的多个关系
- 在指针类型之间转换的规则,其中cv限定符是唯一的区别
- 进程间在0到255之间的唯一数字