Windows Win32:基于日期的唯一增量ID的同步
在单个Windows框的范围内生成唯一的递增整数ID既简单又高效:共享内存,Windows Win32:基于日期的唯一增量ID的同步,windows,winapi,synchronization,ipc,Windows,Winapi,Synchronization,Ipc,在单个Windows框的范围内生成唯一的递增整数ID既简单又高效:共享内存,InterlockedIncrement(),故事结束。当ID大于单个整数和/或更复杂时,事情会变得更棘手 出于历史/连续性原因,网络服务的一部分每天需要唯一的递增ID(计数器),日期和计数器为整数。日期基于请求到达前端服务器的时间,而ID是由单个工作进程生成的。这意味着对新ID的请求可能会发生混乱:昨天的ID可以在今天的第一个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()
的目的是强制设置内存障碍(获取语义);这是我见过的,但它合适吗?整体同步方案是否可靠