2013-02-25 2 views
10

Ich denke über die Möglichkeit, die Verwendung von Software Transactional Memory durch 1 oder 2 geführte Labors für einen Universitätskurs zu unterrichten. Ich weiß nur über Haskells STM, aber die Studenten des Kurses haben wahrscheinlich nie ein Wort darüber gehört.Nicht-Toy Software Transaktionsspeicher für C oder Java

Ich habe bereits einige Listen solcher Bibliotheken online oder in anderen Fragen gefunden (z. B. http://en.wikipedia.org/wiki/Software_transactional_memory#C.2FC.2B.2B). Ich überprüfe sie, während Sie das lesen, aber viele von ihnen scheinen keine sehr schöne Dokumentation zu haben (die meisten sind Forschungsprototypen, die in den Papieren nur vage beschrieben sind, und ich würde lieber etwas über besser gebrauchte und gut dokumentierte unterrichten). Darüber hinaus hängen viele der von Wikipedia bereitgestellten Links.

Um es zusammenzufassen, gibt es STM-Implementierungen für industrielle Projekte (oder zumindest Nicht-Spielzeug, um ein gewisses Maß an Qualität zu gewährleisten) und gut dokumentiert (um einige gute Hinweise für die Schüler zu geben)?

EDIT: Ich bin nicht der Lehrer des Kurses, ich helfe ihm nur mit den Labors. Natürlich werden den Studenten Grundlagen der Parallelität und verteilte Algorithmen vermittelt. Dies war nur eine Idee, um gegen Ende des Kurses etwas anderes vorzuschlagen.

+3

In Ordnung, bitte kommentieren Sie, wie man die Frage verbessern kann, anstatt die Entscheidung zu verwerfen und vorzuschlagen. Der Punkt ist ziemlich einfach: Ich brauche eine einfache und gut dokumentierte Implementierung. –

+6

Zustimmen. Nichts schlimmer als anonyme Downvoters und Closers. – Joe

+0

Ich habe nicht downvote, aber kann nur vermuten, dass down/close vote war, weil die Frage auf einen Mangel an Forschung hindeutet. Der erste Link, der von googlen "Software-Transaktionsspeicher" zurückgegeben wird, ist eine Wikipedia-Seite, die mit Implementierungen in C, Java und vielen anderen Sprachen verknüpft ist. – simonc

Antwort

5

STM-Bibliotheken in Produktionsqualität sind nicht als Teaching-Tool gedacht, nicht einmal als "Best Practice". Was ist es wert für jeden College/Universität-Kurs zu lernen ist vielleicht 1% des Codes; die restlichen 99% sind nitty-gritty plattformabhängige intrinsische corner-cases. Die 1%, die interessant ist, ist in keiner Weise hervorgehoben, so dass Sie keine Möglichkeit haben, es zu finden.

Ich empfehle für einen College/Universität-Kurs (egal ob Anfänger oder Fortgeschrittener) STM-Bausteine ​​selbst zu implementieren (und nur für 1 Plattform).

beginnen, indem sie die Probleme der Einführung: Concurrency, Cache ...

dann die Atom Helfer stellen wir haben: cas/cmpxchg Zaun.

Dann bauen Sie zusammen mit Ihren Schülern Beispiele auf, zuerst einfach, dann härter und komplexer.

+1

Ich suchte nach Produktionsqualitätsimplementierungen, um etwas mit einer breiten Community und Dokumentation zu haben, aber ich hatte nicht die Absicht, ihnen ein umfassendes Verständnis eines solchen Frameworks zu vermitteln, nur die 1%, um grundlegende STM-Mechanismen zu sehen Aktion. Ihr Vorschlag ist jedoch viel besser als meine Idee. Ich denke, ich schlage vor, dem Lehrer zu folgen und zu sehen, ob es ihm recht ist, ein paar Labs zu widmen, um die Studenten dazu zu bringen, grundlegende STM-Mechanismen zu implementieren. Vielen Dank. –

3

beginnen, indem sie die Probleme der Einführung: Concurrency, Cache ...

von eznme Führende auf, einige gute Probleme, die ich während für concurrency an der Universität abgedeckt.

  • Dining philosophers problem

    In der Informatik ist das speisenden Philosoph Problem ein Beispiel Problem oft in gleichzeitiger Entwicklung von Algorithmen verwendet, um Probleme bei der Synchronisierung und Techniken zur Lösung von ihnen veranschaulichen.

    dining phil

die gleiche Implementierung von here Unter Verwendung von Je Magee und Je Kramer, und die Lösung des Problems Monitore verwenden.

Die meisten Shared-Memory-Anwendungen sind effizienter mit Integers als Strings (aufgrund AtomicInteger Klasse für Java). Der beste Weg, um shared memory zu demonstrieren, ist meiner Meinung nach, die Studenten dazu zu bringen, eine Anwendung zu schreiben, die eine threadpool verwendet, um Primzahlen zu berechnen oder einige integral zu berechnen. Ein gutes Beispiel für Threads und Shared Memory ist das Producer-consumer problem.

Das Producer-Consumer-Problem (auch als Bounded-Buffer-Problem bekannt) ist ein klassisches Beispiel für ein Multiprozess-Synchronisationsproblem.

producer http://cse.csusb.edu/tong/courses/cs460/images/producer-consumer.gif

Implementierung here gefunden, gibt es auch eine Implementierung von Massey vom Professor in Software Eng Jenz Dietrich.

Für verteilte Algorithmen MapReduce und Hadoop sind stark dokumentierte verteilte Datenstrukturen. Und für Distributed Programming Libraries schauen Sie in MPI (Message Passing Interface) und OpenMP (oder Pragma für C++). Es gibt auch Implementierungen von Dijkstra shortest path algorithm in parallel zu.

+0

Danke, ich habe die Frage bearbeitet, um den Zusammenhang zu verdeutlichen. Der Kurs behandelt die gleichzeitige und verteilte Programmierung/Algorithmen und ich bin nicht der Lehrer. Sowohl im Unterricht als auch in den Laboratorien wird es viel Hintergrundwissen geben. Dies über Transaktionen wäre nur ein Extra: Ich bin nicht auf der Suche nach weiteren Beispielen, über die ich sprechen könnte, daher denke ich, dass Eznmes Vorschlag am besten passt. –

+0

@Riccardo okay, das ist in Ordnung. Ich teile nur die Beispiele, die ich beim Lernen von Nebenläufigkeit und atomaren Transaktionen gezeigt habe. – Killrawr

+0

@Riccardo Die Antwort auf Links zu verteilten Algorithmen/Datenstrukturen und Bibliotheken wurde aktualisiert. – Killrawr

1

Es gibt drei gute Möglichkeiten, STM heute zu verwenden.

Der erste Weg ist die Verwendung von gcc und tun TM in C oder C++. Ab gcc 4.7 wird Transaktionsspeicher über das Flag -fgnu-tm unterstützt. Die gcc-Betreuer haben viel Arbeit geleistet, und ab dem Zweig 4.9 (trunk) können Sie sogar Hardware TM (z. B. Intel Haswell TSX) verwenden. Es gibt einen Entwurf der Spezifikation für die Schnittstelle zum TM unter http://justingottschlich.com/tm-specification-for-c-v-1-1/, der nicht zu schmerzhaft ist. Sie können auch Anwendungsfälle von gcc TM von der TM-Community finden (siehe zum Beispiel die Anwendungs-Track-Papiere von transact 2014: http://transact2014.cse.lehigh.edu).

Die Implementierung selbst ist ein bisschen komplex, aber das ist, was es braucht, um richtig zu sein. Es gibt eine Menge Literatur zu den Dingen, die schiefgehen können, besonders in einer unsicheren Sprache wie C oder C++. GCC bekommt all diese Dinge richtig. Ja wirklich.

Die zweite Möglichkeit ist die Verwendung von Java. Sie können entweder DeuceSTM verwenden, was sehr einfach zu erweitern ist (Typ Sicherheit macht die TM-Implementierung viel einfacher!), Oder verwenden Sie die Akka-Bibliothek von Scala für STM. Ich bevorzuge Deuce, weil es einfacher zu erweitern und einfacher zu verwenden ist (Sie kommentieren einfach eine Methode als @Atomic, und Deuces Java-Agenten erledigen den Rest).

Die dritte Möglichkeit ist die Verwendung von Scala. Ich habe nicht viel in diesem Raum getan, aber Forscher scheinen Akka zu lieben. Wenn Sie mit einer parallelen/verteilten Klasse verbunden sind, verwenden Sie möglicherweise sogar Scala.