запрос функции: функция atomicAdd() включена в gwan.h

В параметрах G-WAN KV KV_INCR_KEY будет использовать 1-е поле в качестве первичного ключа.

Это означает, что существует функция, которая атомарно увеличивает уже встроенную в ядро ​​G-WAN функцию, чтобы этот первичный индекс работал.

Было бы хорошо сделать эту функцию открытой для использования сервлетами, т.е. включить в gwan.h.

Таким образом, новички в ANSI C, такие как я, могут извлечь из этого пользу.


person k.k. lou    schedule 09.11.2012    source источник
comment
Какой у Вас вопрос? Как сделать KV_INCR_KEY доступным для вашего сервлета на основе C?   -  person tomlogic    schedule 09.11.2012
comment
в http://gwan.com/api#kv, enum KV_OPTIONS { KV_GC_ALLOC = 1, // сборка мусора, поведение по умолчанию KV_PERSISTANCE = 2, // периодический файловый ввод-вывод (с использованием обратного вызова kv_recfn()) KV_INCR_KEY = 4, // 1-е поле: первичный ключ (автоматически увеличивается) ...};   -  person k.k. lou    schedule 09.11.2012


Ответы (2)


Об этом было много дискуссий на старом форуме G-WAN, и людям было предложено поделиться своим опытом работы с атомарными операциями, чтобы создать богатый список документированных функций для каждой платформы.

Атомарные операции не переносимы, потому что они напрямую обращаются к процессору. Это означает, что код для Intel x86 (32-разрядная версия) и Intel AMD64 (64-разрядная версия) отличается. Каждая платформа (ARM, Power7, Cell, Motorola и т. д.) имеет свои атомарные наборы инструкций.

Такой список до сих пор не был опубликован в файле gwan.h, поскольку основные операции легко найти (файл Компилятор GCC предлагает несколько атомарных встроенных функций в качестве расширений C), но более сложные операции менее очевидны (требуются asm навыков), и люди будут создавать их по мере необходимости - для очень специфического использования в своем коде. .

Программная инженерия — это всегда баланс между тем, что можно сделать доступным при минимально возможных затратах на вход (например, магазин G-WAN KV, в котором используется небольшое количество функций), и тем, как это работает на самом деле (которому гораздо сложнее следовать). .

Итак, помимо очевидного (incr/decr, set/get), чтобы узнать больше об атомарных операциях, используйте Google, найдите руководства по наборам инструкций ЦП и вооружитесь смелостью!

person Gil    schedule 09.11.2012
comment
Хотя атомарные операции не переносимы, но если gwan может работать под моей платформой, внутренние атомарные операции gwan также должны быть повторно использованы в моих сервветах, поскольку они были скомпилированы для соответствия моей платформе. Поэтому по-прежнему разумно запрашивать экспорт таких функций в gwan.h. - person k.k. lou; 09.11.2012
comment
Спасибо за ваше объяснение. Согласитесь с вами, что нам нужно больше узнать об атомарных операциях. Гван уже предоставил хранилище kv для атомарного get/set. Для веб-разработки я редко разрабатываю сложные операции, поэтому очевидный/базовый атомарный приращение все еще необходим для меня, так как я не программист. я веб-разработчик. - person k.k. lou; 09.11.2012
comment
К. К. Лу, посмотрите на ссылку (озаглавленную Компилятор GCC предлагает несколько аомических встроенных функций), которую я дал в ответе выше - здесь у вас есть все, что вам нужно для основных нужд (включая приращение на 1, которое вы просили). - person Gil; 10.11.2012
comment
спасибо за вашу гиперссылку. я не уверен, работают ли они в Tiny C Compiler или нет, так как я слышал, что gwan использует TCC для компиляции сценариев C, и эти функции встроены в компилятор GCC. Пожалуйста, поправьте меня, если я ошибаюсь. Прежде чем начать использовать эти функции, я ищу примеры, чтобы узнать, как их использовать. - person k.k. lou; 10.11.2012
comment
G-WAN использует GCC, а не компилятор Tiny C. - person Gil; 10.11.2012
comment
Вы имеете в виду, что gwan использует GCC для компиляции сервлетов и обработчиков при запуске gwan? - person k.k. lou; 10.11.2012
comment
Да, для сценариев C это GCC. Для Java это JVM. Для C# это Mono. и т.п. - person Gil; 11.11.2012

Спасибо Гил за полезные советы.
Теперь я могу сделать это сам.
Я изменил код в файле 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);

Я получил 52 000 incr_operations/msec с моим старым процессором E2180.
Итак, с компилятором GCC я могу сделать это самостоятельно.
еще раз спасибо.

person k.k. lou    schedule 12.11.2012
comment
Идти работать. Обратите внимание, что ключевое слово volatile не помогает при проблемах с параллелизмом (оно не вредит, но не приносит пользы). Фактически, его можно считать устаревшим в многоядерных системах. - person Gil; 13.11.2012
comment
Вот отличное обсуждение атомарности, блокировок и других стратегий, и каждый метод тестируется на скорость с исходным кодом C: webfiveoh.com/content/features/2012/dec/sat-22nd/ - person Gil; 25.12.2012