在 G-WAN KV 选项中,KV_INCR_KEY
将使用第一个字段作为主键。
这意味着有一个函数可以原子地递增G-WAN核心中已经内置的,以使这个主索引工作。
最好打开这个函数供 servlet 使用,即包含在 gwan.h 中。
通过这样做,像我这样的ANSI C新手可以从中受益。
在旧的G-WAN论坛上对此进行了大量讨论,并邀请人们分享他们在原子操作方面的经验,以便逐个平台地构建丰富的文档化功能列表。
原子操作不可移植,因为它们直接寻址 CPU。这意味着英特尔x86(32位)和英特尔AMD64(64位)的代码是不同的。每个平台(ARM,Power7,Cell,Motorola等)都有自己的原子指令集。
到目前为止,这样的列表还没有在gwan.h
文件中发布,因为基本操作很容易找到(GCC 编译器提供了几个原子内部函数作为 C 扩展),但更复杂的操作不太明显(需要asm
技能),人们会根据需要构建它们 - 用于代码中非常具体的用途。
软件工程始终是在以尽可能低的入门成本提供的内容(如G-WAN KV商店,它使用少量功能)和实际工作方式(远不那么简单)之间取得平衡。
因此,除了显而易见的(incr/decr,set/get)之外,要了解有关原子操作的更多信息,请使用Google,查找CPU指令集手册,并用勇气武装自己!
感谢 Gil 的有用指导。
现在,我可以自己做。
我在 persistence.c 中更改了代码,如下所示:
首先,我将数据中 val 的定义更改为易失性。
//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/毫秒。
因此,使用GCC编译器,我可以自己完成。
再次感谢。