功能请求:gwan.h中包含的atomicAdd()函数

时间:2012-11-09 04:34:38

标签: key-value-store atomicity g-wan

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

这意味着有一个函数可以在G-WAN核心中以原子方式递增,以使该主索引起作用。

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

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

2 个答案:

答案 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编译器,我可以自己完成 再次感谢。