【问题标题】:feature request: an atomicAdd() function included in gwan.h功能请求:gwan.h 中包含的 atomicAdd() 函数
【发布时间】:2012-11-09 04:34:38
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您的问题是什么?如何让基于 C 的 servlet 可以使用 KV_INCR_KEY
  • in http://gwan.com/api#kv, enum KV_OPTIONS { KV_GC_ALLOC = 1, // 垃圾回收,默认行为 KV_PERSISTANCE = 2, // 周期性文件 I/O (使用 kv_recfn( ) 回调) KV_INCR_KEY = 4, // 第一个字段:主键(自动递增)...};

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


【解决方案1】:

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

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

到目前为止,此类列表尚未在gwan.h 文件中发布,因为基本操作很容易找到(GCC compiler offers several atomic intrinsics 作为 C 扩展)但更复杂的操作不太明显(需要 asm 技能),人们会根据需要构建它们 - 用于代码中非常具体的用途。

软件工程始终在以尽可能低的入门成本提供的内容(例如使用少量功能的 G-WAN KV 存储)和实际工作方式(远不那么简单)之间取得平衡跟随)。

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

【讨论】:

  • 虽然原子操作不可移植,但是如果gwan可以在我的平台下运行,gwan内部的原子操作也必须可以在我的servets中重用,因为它们已经编译为适合我的平台。 所以,要求在gwan.h中导出这些函数还是合理的
  • 感谢您的解释。同意你的观点,我们需要更多地了解原子操作。 Gwan 已经为 atomic get/set 提供了 kv 存储。对于 web 开发,我很少设计复杂的操作,所以明显/基本的原子增量对我来说仍然是必要的,因为我不是程序员。我是一名网络开发人员。
  • K. K. Lou,查看链接(标题为 “GCC 编译器提供了几个 aomic 内在函数”)我在上面的答案中给出了 - 这里你有基本需求所需的一切(包括你需要的 1 的增量)请求)。
  • 感谢您的超链接。我不确定它们是否在 Tiny C 编译器中工作,因为我听说 gwan 正在使用 TCC 编译 C 脚本并且这些函数是在 GCC 编译器中构建的。如果我错了,请纠正我。在开始使用这些功能之前,我正在搜索示例以了解如何使用它们。
  • G-WAN 使用 GCC 而 Tiny C 编译器。
【解决方案2】:

感谢 Gil 的帮助指导。
现在,我可以自己做。
我更改persistence.c中的代码,如下:
首先,我将data中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 编译器我可以自己完成。
再次感谢。

【讨论】:

  • 去工作吧。请注意,关键字 volatile 对并发问题没有帮助(它不会造成伤害,但不会带来任何好处)。事实上,它在多核系统上可能被视为已弃用。
  • 这里是关于原子性、锁和其他策略的精彩讨论,每种方法都使用 C 源代码进行了速度测试:webfiveoh.com/content/features/2012/dec/sat-22nd/…
猜你喜欢
  • 1970-01-01
  • 2020-09-18
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 2013-10-02
  • 2013-09-23
相关资源
最近更新 更多