2012-11-09 53 views
1

在G-WAN KV選項中,KV_INCR_KEY將使用1st字段作爲主鍵。功能請求:gwan.h中包含的atomicAdd()函數

這意味着存在一個函數,該函數已經在G-WAN核心中原子化地增加以使該主索引工作。

將此函數打開以供servlet使用(即包含在gwan.h中)會很好。

通過這樣做,像我這樣的ANSI C新手可以從中受益。

+0

你的問題是什麼?如何讓KV_INCR_KEY可用於基於C的servlet? – tomlogic

+0

in http://gwan.com/api#kv, 枚舉KV_OPTIONS { KV_GC_ALLOC = 1,//垃圾回收,默認行爲 KV_PERSISTANCE = 2,//週期性文件I/O(使用kv_recfn()返回) ** KV_INCR_KEY ** = 4,//第一個字段:主鍵(自動遞增) ...}; –

回答

0

感謝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/msec。
所以,使用GCC編譯器我可以自己做。
再次感謝。

+0

去工作。請注意,關鍵字* volatile *對併發問題沒有任何幫助(它不會傷害,但不會帶來任何好處)。實際上,它可能被認爲在多核系統上被棄用。 – Gil

+1

下面是關於原子性,鎖定和其他策略的一個很好的討論,每個方法都用C源代碼進行速度測試:http://webfiveoh.com/content/features/2012/dec/sat-22nd/parallel-programming-the - 第三,way.html – Gil

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指令集手冊,並勇於武裝自己!

+0

雖然原子操作不是可移植的,但如果gwan可以在我的平臺下運行,gwan的內部原子操作必須可以在我的serlvets中重用,因爲它們已經被編譯以適合我的平臺。 **因此,請求在gwan.h **中輸出此類函數仍然是合理的。 –

+0

感謝您的解釋。同意你的看法,我們需要更多地瞭解原子操作。 Gwan已經提供了原子get/set的kv商店。對於Web開發,我很少設計複雜的操作,因此我明顯/基本的原子增量仍然是必需的,因爲我不是程序員。我是一名Web開發人員。 –

+0

K. K. Lou,看看這個鏈接(標題爲「GCC編譯器提供了幾個aomic內在函數」**)我在上面的答案中給出了 - 在這裏你有你需要的所有基本需求(包括你請求的增量1)。 – Gil