2016-05-01 6 views
8

Die Verwendung von Sperren und Mutexe ist illegal in harten Echtzeit-Rückrufe. Lock-freie Variablen können in verschiedenen Threads gelesen und geschrieben werden. In C kann die Sprachdefinition gebrochen sein oder nicht, aber die meisten Compiler spenden brauchbaren Assemblercode aus, wenn eine Variable als flüchtig deklariert wird (der Leser-Thread behandelt die Variable als Hardwareregister und gibt somit Ladeanweisungen aus, bevor die Variable verwendet wird). was auf den meisten Cache-kohärenten Multiprozessorsystemen gut genug funktioniert.)Lock-frei geteilte Variable in Swift? (funktionierende flüchtige)

Kann diese Art von Variablenzugriff in Swift angegeben werden? Oder müssen Inline-Assembler oder Datencache-Flush/Invalidate-Hinweise stattdessen zur Swift-Sprache hinzugefügt werden?

Hinzugefügt: Wird die Verwendung von Aufrufen von OSMemoryBarrier() (von OSAtomic.h) vor und nach und jede Verwendung oder Aktualisierung von möglicherweise inter-thread Variablen (wie "Lock-free" Fifo/Puffer Statuszähler, etc.) in Swift erzwingen ausreichend geordneten Speicher laden und speichern Anweisungen (auch auf ARM-Prozessoren)?

+0

Warum sollte eine High-Level-Sprache ein Konstrukt für ein Feature definieren, das nur für eine bestimmte Hardwarearchitektur zu funktionieren scheint, aber für viele kompiliert werden kann, einschließlich eines mit schwach geordnetem Speichermodell (ARM)? Darüber hinaus funktioniert das '' volatile'' niemals zuverlässig für das, wonach Sie suchen. – CouchDeveloper

+0

Ein Anspruch ist, dass Swift zielt darauf ab, als eine industrielle Stärke System Programmiersprache nützlich sein. Industrielle Systeme sind oft mit kundenspezifischen physischen realen Eingängen und Steuerungen verbunden, die Echtzeit-Betriebsbeschränkungen haben. – hotpaw2

+0

In Szenarien wie diesen können Sie weiterhin über eine C-API eine Schnittstelle herstellen. Aber "volatile" wird sowieso nicht zur Lösung von gleichzeitigen Problemen geeignet sein. Hast du einen Blick in die [Atomics Operations Library] (http://en.cppreference.com/w/c/atomic) im C11-Standard geworfen? Es gibt sperrfreie Primitive. – CouchDeveloper

Antwort

2

Wie bereits erwähnt, garantiert volatile nur, dass die Variable nicht in den Registern zwischengespeichert wird (wird selbst als Register behandelt). Das allein macht es nicht frei für Lese- und Schreibvorgänge. Es garantiert nicht einmal seine Atomizität, zumindest nicht in einer konsistenten, plattformübergreifenden Weise.

Warum? Befehlspipeline und Oversizing (z. B. Verwendung von Float64 auf einer Plattform mit 32-Bit-Gleitpunktregistern oder weniger) kommen zuerst in den Sinn.

Haben Sie darüber nachgedacht, OSAtomic zu verwenden?

+0

Es gibt viele Dinge, die nicht plattformübergreifend sind, die in einer Systemprogrammiersprache auf hoher Ebene für bestimmte Sätze von Systemen noch möglich sein sollten. Plattformspezifisch sollte nicht bedeuten "Sie müssen in Assemblersprache programmieren". Das ARM-Handbuch spezifiziert bestimmte atomare Schreibausrichtung und Größenanforderungen. – hotpaw2

+0

Richtig, wenn Sie für einen bestimmten Prozessor entwickeln, möchten Sie vielleicht Verantwortung auf höheren Ebenen übernehmen und die Programmiersprache sollte Sie unterstützen. Aber ich fürchte, Swift hat keine Alternative für "volatile", zumindest soweit ich weiß. –