Неигровая программная транзакционная память для C или Java

Я подумываю о возможности обучения использованию Transactional Memory через 1 или 2 управляемые лаборатории для университетского курса. Я знаю только о Haskell STM, но студенты курса, вероятно, никогда не слышали ни слова об этом.

Я уже нашел некоторые списки таких библиотек в Интернете или в других вопросах (например, http://en.wikipedia.org/wiki/Software_transactional_memory#C.2FC.2B.2B). Я проверяю их, когда вы читаете это, но многие из них, похоже, не имеют очень красивой документации (большинство из них - это прототипы исследований, которые смутно описаны в документах, и я бы предпочел научить чему-то более используемому и хорошо документированному). Кроме того, многие ссылки, предоставленные wikipedia, свисают.

Подводя итоги, существуют ли реализации STM, направленные на промышленные проекты (или, по крайней мере, не игрушечные, для обеспечения определенного уровня качества) и хорошо документированные (чтобы дать хорошие рекомендации студенты)?

РЕДАКТИРОВАТЬ: Я не преподаватель курса, я просто помогаю ему в лабораториях. Конечно, студенты будут изучать основы concurrency и распределенные алгоритмы раньше. Это была просто идея предложить что-то другое в конце курса.

Ответ 1

STM-библиотеки производственного качества не предназначены как учебный инструмент, даже не как "лучшая практика". Что стоит изучать для любого курса колледжа/университета, возможно, 1% кода; оставшиеся 99% - ничтожные зависящие от платформы внутренние угловые шкафы. Интересный 1% не выделяется никоим образом, поэтому вы не можете его найти.

То, что я рекомендую для курса в колледже/университете (независимо от того, вводящий или продвинутый), необходимо реализовать STM-buildingblocks самостоятельно (и только для 1 платформы).

Начните с введения проблем: concurrency, cache...

Затем введите атомные помощники: cas/cmpxchg, fence.

Затем создайте примеры вместе со своими учениками, сначала легко, затем сложнее и сложнее.

Ответ 2

Start by introducing the problems: concurrency, cache...

Исходя из eznme, некоторых хороших проблем, которые я рассмотрел, пока учился в университете на concurrency.

  • Столовая философская проблема

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

    dining phil
    (source: wikimedia.org)

Используя ту же реализацию из здесь, Je Magee и Je Kramer, и решая проблему с помощью мониторов.

Большинство приложений с общей памятью более эффективны с Integers, чем со Strings (из-за класса AtomicInteger для Java). Так что, на мой взгляд, лучший способ продемонстрировать shared memory - это заставить студентов написать приложение, которое использует threadpool для вычисления простых чисел или для вычисления integral.

Или хорошим примером потоков и разделяемой памяти является проблема производителя-потребителя.

Проблема производителя-потребителя (также известная как проблема ограниченного буфера) является классическим примером проблемы многопроцессорной синхронизации.

producer
(source: csusb.edu)

Реализация найдена здесь, также есть реализация от Мэсси от профессора Software Eng Дженц Дитрих.

Для распределенных алгоритмов MapReduce и Hadoop являются хорошо документированными распределенными структурами данных. А для библиотек распределенного программирования смотрите MPI (интерфейс передачи сообщений) и OpenMP (или Pragma для C++). Также есть реализации алгоритма кратчайшего пути Дейкстры в параллельной.

Ответ 3

Сегодня есть три хороших способа сделать STM.

Первый способ - использовать gcc и do TM в C или С++. Начиная с gcc 4.7, транзакционная память поддерживается с помощью флага -fgnu-tm. Сопровождающие gcc выполнили большую работу, а с ветки 4,9 (соединительная линия) вы даже можете использовать аппаратное TM (например, Intel Haswell TSX). Существует проект спецификации интерфейса TM на http://justingottschlich.com/tm-specification-for-c-v-1-1/, что не слишком болезненно. Вы также можете найти примеры использования gcc TM из сообщества TM (см., Например, документацию треков приложения от transact 2014: http://transact2014.cse.lehigh.edu).

Сама реализация немного сложна, но что нужно, чтобы она была правильной. Там много литературы о том, что может пойти не так, особенно на небезопасном языке типа C или С++. GCC получает все эти права. На самом деле.

Второй способ - использовать Java. Вы можете использовать DeuceSTM, который очень легко расширить (тип безопасности значительно упрощает реализацию TM), или использовать Scala библиотеку Akka для STM. Я предпочитаю Deuce, потому что он проще расширять и упрощать использование (вы просто комментируете метод как @Atomic, а агенты Deuce java делают все остальное).

Третий способ - использовать Scala. Я не много сделал в этом пространстве, но исследователи, похоже, любят Акку. Если вы связаны с параллельным/распределенным классом, вы даже можете использовать Scala уже.