在G-WAN KV選項中,KV_INCR_KEY
將使用1st字段作爲主鍵。功能請求:gwan.h中包含的atomicAdd()函數
這意味着存在一個函數,該函數已經在G-WAN核心中原子化地增加以使該主索引工作。
將此函數打開以供servlet使用(即包含在gwan.h中)會很好。
通過這樣做,像我這樣的ANSI C新手可以從中受益。
在G-WAN KV選項中,KV_INCR_KEY
將使用1st字段作爲主鍵。功能請求:gwan.h中包含的atomicAdd()函數
這意味着存在一個函數,該函數已經在G-WAN核心中原子化地增加以使該主索引工作。
將此函數打開以供servlet使用(即包含在gwan.h中)會很好。
通過這樣做,像我這樣的ANSI C新手可以從中受益。
感謝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編譯器我可以自己做。
再次感謝。
在舊的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的內部原子操作必須可以在我的serlvets中重用,因爲它們已經被編譯以適合我的平臺。 **因此,請求在gwan.h **中輸出此類函數仍然是合理的。 –
感謝您的解釋。同意你的看法,我們需要更多地瞭解原子操作。 Gwan已經提供了原子get/set的kv商店。對於Web開發,我很少設計複雜的操作,因此我明顯/基本的原子增量仍然是必需的,因爲我不是程序員。我是一名Web開發人員。 –
K. K. Lou,看看這個鏈接(標題爲「GCC編譯器提供了幾個aomic內在函數」**)我在上面的答案中給出了 - 在這裏你有你需要的所有基本需求(包括你請求的增量1)。 – Gil
你的問題是什麼?如何讓KV_INCR_KEY可用於基於C的servlet? – tomlogic
in http://gwan.com/api#kv, 枚舉KV_OPTIONS { KV_GC_ALLOC = 1,//垃圾回收,默認行爲 KV_PERSISTANCE = 2,//週期性文件I/O(使用kv_recfn()返回) ** KV_INCR_KEY ** = 4,//第一個字段:主鍵(自動遞增) ...}; –