1

在 G-WAN KV 选项中,KV_INCR_KEY将使用第一个字段作为主键。

这意味着在 G-WAN 核心中已经内置了一个以原子方式递增的功能,以使该主索引正常工作。

最好将此函数打开以供servlet 使用,即包含在gwan.h 中。

通过这样做,像我这样的 ANSI C 新手可以从中受益。

4

2 回答 2

1

在旧的 G-WAN 论坛上对此进行了充分讨论,并邀请人们分享他们在原子操作方面的经验,以便逐个平台构建丰富的文档功能列表。

原子操作不可移植,因为它们直接寻址 CPU。这意味着 Intel x86(32 位)和 Intel AMD64(64 位)的代码不同。每个平台(ARM、Power7、Cell、Motorola 等)都有自己的原子指令集。

gwan.h到目前为止,此类列表尚未在文件中发布,因为基本操作很容易找到( GCC 编译器提供了几个原子内在函数作为 C 扩展),但更复杂的操作不太明显(需要asm技能),人们会根据需要构建它们 -在他们的代码中非常具体的用途。

软件工程始终在以尽可能低的入门成本(例如使用少量功能的 G-WAN KV 存储)和它的实际工作方式(这远不那么容易遵循)之间取得平衡.

因此,除了显而易见的(incr/decr、set/get)之外,要了解更多关于原子操作的信息,请使用 Google,查找 CPU 指令集手册,并鼓起勇气武装自己!

于 2012-11-09T12:59:32.750 回答
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 编译器,我可以自己完成。
再次感谢。

于 2012-11-12T04:40:44.800 回答