Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.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/7/google-maps/4.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 Win32:基于日期的唯一增量ID的同步_Windows_Winapi_Synchronization_Ipc - Fatal编程技术网

Windows Win32:基于日期的唯一增量ID的同步

Windows Win32:基于日期的唯一增量ID的同步,windows,winapi,synchronization,ipc,Windows,Winapi,Synchronization,Ipc,在单个Windows框的范围内生成唯一的递增整数ID既简单又高效:共享内存,InterlockedIncrement(),故事结束。当ID大于单个整数和/或更复杂时,事情会变得更棘手 出于历史/连续性原因,网络服务的一部分每天需要唯一的递增ID(计数器),日期和计数器为整数。日期基于请求到达前端服务器的时间,而ID是由单个工作进程生成的。这意味着对新ID的请求可能会发生混乱:昨天的ID可以在今天的第一个ID已经分发之后请求 在互斥锁中封装两个计数器(一个用于奇数天,一个用于偶数天)充分解决了这个

在单个Windows框的范围内生成唯一的递增整数ID既简单又高效:共享内存,
InterlockedIncrement()
,故事结束。当ID大于单个整数和/或更复杂时,事情会变得更棘手

出于历史/连续性原因,网络服务的一部分每天需要唯一的递增ID(计数器),日期和计数器为整数。日期基于请求到达前端服务器的时间,而ID是由单个工作进程生成的。这意味着对新ID的请求可能会发生混乱:昨天的ID可以在今天的第一个ID已经分发之后请求

在互斥锁中封装两个计数器(一个用于奇数天,一个用于偶数天)充分解决了这个问题,所以这就是我在生产中要做的

但是,这种情况特别是,id的日部分保证每24小时仅更改一次,即在99.999%以上的时间内,共享整数的简单InterlockedIncrement()就足够了。因此,我想知道一个更贴切的解决方案会是什么样子,纯粹出于教育目的

下面是我想出的一些伪代码:

SomeMutex id\u mutex;
DayBasedId计数器[2];//奇数天和偶数天的共享内存计数器记录
// ...
int获取新id(int今天)
{
DayBasedId*计数器=计数器+(朱利安日数(今天)和1);
如果(InterlocatedCompareeExchange(&counter->day,0,0)!=今天)
{
获取(id_互斥);
如果(柜台->天!=今天)
{
柜台->日=今天;
计数器->值=0;
}
释放(id_互斥);
}
返回联锁增量(&计数器->val);
}
InterlockedCompareeExchange()
的目的是强制设置内存障碍(获取语义);这是我见过的,但它合适吗?整体同步方案是否可靠