Неигровая программная транзакционная память для 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 уже.