Подтвердить что ты не робот

Портативная библиотека сравнения и свопинга (атомарные операции) C/С++?

Есть ли небольшая библиотека, которая обертывает различные операции с CAS-процессорами в макросы или функции, которые переносимы для нескольких компиляторов?

PS. library.hpp library находится внутри boost:: interprocess:: detail namespace. Автор отказывается сделать его общедоступной, ухоженной библиотекой.

Позволяет повторно открыть вопрос и посмотреть, есть ли другие параметры?

4b9b3361

Ответ 1

Intel Threading Building Blocks имеет приятный переносимый atomic<T> шаблон, который делает то, что вы хотите. Но независимо от того, будет ли это небольшая библиотека или нет, можно, конечно, обсуждать..

Ответ 2

OPA (Open Portable Atomics) может быть подходящим для ваших нужд. https://trac.mcs.anl.gov/projects/openpa/

Он обеспечивает согласованный C API для общих атомных операций на нескольких платформах под лицензией типа MIT. Библиотека небольшая и, безусловно, соответствует вашим требованиям к размеру. Текущий список платформы:

  • Встроенная сборка GCC для процессоров x86, x86_64, ia64, PPC 440 и MIPS 5K. Несколько компиляторов с интерфейсами GCC-совместимых-ish также поддерживаются на тех же архитектурах, как icc, PGI и IBM xlc.
  • Атомные свойства GCC, поэтому поддерживаются большинство установок GCC-4.1 +.
  • Библиотека атомных операций SUN Solaris.
  • Внутренние возможности Windows NT (хотя в настоящее время вам нужно немного поработать над Windows).
  • Две псевдо-платформы, эмуляция на основе мьютекса pthread для переносимости на другие неподдерживаемые платформы (при снижении производительности) и "небезопасную" реализацию для использования в коде, который условно скомпилирован как однопоточный код.

Я никогда не использовал его в программе на С++, хотя он должен работать с небольшими изменениями или без изменений. Я был бы рад изменить его, если у вас возникнут проблемы (просто отправьте сообщение [email protected]).

Ответ 3

Библиотека межпроцессного ускорения может быть тем, чем вы являетесь - файл include Atomic.hpp содержит реализации сравнения и замены для различных платформ и компиляторов.

Ответ 4

Вам могут быть интересны функции Glib Atomic Operations,

g_atomic_int_compare_and_exchange()

реализует семантику CAS для различных архитектур. Сама реализация довольно легко понять и может быть использована автономно без особых усилий, вы можете найти ее на svn.gnome.org/viewvc/под glib/trunk/glib/gatomic. {C, h}. Надеюсь, это поможет!

Ответ 5

В Mac OS X и Windows есть встроенные функции CompareAndSwap, которые вы должны использовать в любом случае (InterlockedCompareExchange() и OSAtomicCompareAndSwapPtrBarrier() соответственно). Таким образом, будет работать независимо от компиляторов на этих платформах.

В других Unix-системах это немного сложнее, если вы используете GCC 4.1 или более позднюю версию, вы можете просто использовать встроенный __sync_val_compare_and_swap(), и многие из них, хотя не все компиляторы unix поддерживают разумные расширения gcc, так как много кода, исходящего из Linux, предполагает они присутствуют.

Итак, если вы хотите их обернуть таким образом, чтобы работать с большинством компиляторов для всех процессоров на OS X и Windows, а также с GCC и некоторыми другими компиляторами на других платформах вы должны сделать что-то вроде:

boolean CompareAndSwapPointer(volatile * void * ptr,
                                  void * new_value,
                                  void * old_value) {
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050
  return OSAtomicCompareAndSwapPtr (old_value, new_value, ptr);
#elif defined(_MSC_VER)
  return InterlockedCompareExchange(ptr, new_value, old_value);
#elif (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100
  return __sync_val_compare_and_swap(ptr, old_value, new_value);
#else
#  error No implementation
#endif
}

Это не проверено, но я думаю, что это должно быть правильно. Обратите внимание, что все библиотеки ОС принимают аргументы в разных порядках, -)

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

Ответ 6

Существует библиотека проекта atomic_ops от Boehm. Dunno о лицензии, тем не менее.

Ответ 7

Существует предлагаемая С++ 0x-совместимая библиотека атомизации Boost: http://www.chaoticmind.net/~hcb/projects/boost.atomic/

Цель этой библиотеки - обеспечивают реализацию атомных операции для повышения, основанные на интерфейс, указанный в проекте С++ 0x стандарт. Цель переход на std:: atomic easy, as а также предоставление средств для создания кода используя эту функцию С++ 0x, компилируемую на более старые системы.

Он явно не является частью Boost, но вы можете посмотреть здесь обзорную тему: http://lists.boost.org/Archives/boost/2009/12/160195.php

Boost.Atomic теперь в форме, что я подумайте о том, чтобы назвать его выпуском. В нем есть поддержка "истинных" атомных переменных на:

  • gcc/x86, 32-бит (проверено на Linux, FreeBSD)
  • gcc/x86, 64-бит (протестирован в Linux)
  • gcc/powerpc32 (протестирован в Linux, Mac OS X)
  • gcc/powerpc64 (непроверенный)
  • общий Win32 (протестирован с Visual Studio Express в Win XP)

Для всех остальных он отступает изящно закрытой операции. Там это правильная документация по быстрому заказу, включая, на наш взгляд, иллюстративный пример.

Ответ 8

Что сказал автор (в приведенной ссылке): "Я думаю, вы можете использовать их безопасно, пока не появится какая-то официальная библиотека Boost". Отмените изменение интерфейса до тех пор, пока "когда атомные функции не будут присутствовать в С++ 0x".

Что бы вы ни использовали сегодня, вы, вероятно, захотите перейти на новую функциональность std::, когда она будет доступна в любом случае.

Ускоренный материал, как правило, довольно хорош, похоже, он используется в реализации выпущенной библиотеки Boost. Я также испытывал соблазн использовать эту реализацию несколько раз.

Я бы пошел на это.

Ответ 9

Вы также можете посмотреть на libsync для вдохновения из http://www.ioremap.net/node/224, который является совершенно новым (может быть, слишком новым), но он используется в Elliptics Network, поэтому он получает (некоторые?) тесты.

Он также предоставляет примитивы более высокого уровня рядом с CAS: RCU (Read Copy Update) для блокированной синхронизации между потоками.

Но это зависит от того, что вы подразумеваете под "портативным": он поддерживает архивы x86 и PPC, ОС Linux, FreeBSD, OpenBSD, Solaris и MacOSX, но... нет Windows.

И лицензией является GPL, которую вы можете ненавидеть или любить.