在G-WAN KV选项中,KV_INCR_KEY
将使用第一个字段作为主键。
这意味着有一个函数可以在G-WAN核心中以原子方式递增,以使该主索引起作用。
最好让这个函数打开以供servlet使用,即包含在gwan.h中。
通过这样做,像我这样的ANSI C新手可以从中受益。
答案 0 :(得分:1)
在旧的G-WAN论坛上对此进行了充分的讨论,并邀请人们分享他们在原子操作方面的经验,以便逐个平台地构建丰富的记录功能列表。
原子操作不可移植,因为它们直接对CPU进行寻址。这意味着Intel x86(32位)和Intel AMD64(64位)的代码不同。每个平台(ARM,Power7,Cell,Motorola等)都有自己的原子指令集。
到目前为止,这样的列表尚未在gwan.h
文件中发布,因为基本操作很容易找到(GCC compiler offers several atomic intrinsics作为C扩展)但更复杂的操作不那么明显(需要{{1}技能)人们将根据需要构建它们 - 用于代码中的特定用途。
软件工程总是能够以尽可能低的成本(例如使用少量功能的G-WAN KV商店)以及实际工作方式之间取得平衡(这远不如简单遵循)。
因此,除了显而易见的(incr / decr,set / get)之外,要了解有关原子操作的更多信息,请使用Google,查找CPU指令集手册,并勇敢地武装自己!
答案 1 :(得分:0)
感谢Gil的有用指导。
现在,我可以自己做
我更改了persistence.c中的代码,如下所示:
首先,我将数据中val的定义更改为 volatile 。
//data[0]->val++;
//xbuf_xcat(reply, "Value: %d", data[0]->val);
int new_count, loops=50000000, time1, time2, time;
time1=getus();
for(int i; i<loops; i++){
new_count = __sync_add_and_fetch(&data[0]->val, 1);
}
time2=getus();
time=loops/(time2-time1);
time=time*1000;
xbuf_xcat(reply, "Value: %d, time: %d incr_ops/msec", new_count, time);
我用旧的E2180 CPU获得了52,000 incr_operations / msec 因此,使用GCC编译器,我可以自己完成 再次感谢。