Es ist einfach einzurichten Speicher-Barrieren auf der kernel-Seite: die Makros mb, wmb, rmb, usw. sind immer an Ort und Stelle Dank der Linux-kernel-Header.
Posix definiert eine Anzahl von Funktionen als Speicherbarrieren. Speicherbereiche müssen nicht gleichzeitig zugegriffen werden; um dies zu verhindern, verwenden Sie die Synchronisierung - und, dass die Synchronisierung funktioniert auch als eine Barriere.
Die Synchronisierung ist nicht erforderlich, wenn alle, die erforderlich ist, sperren, und warten Sie kostenlos ein Schriftsteller/eine reader queue. Die POSIX-Bibliotheken bieten nicht mfence/lfence/sfence Operationen, soweit ich weiß.
Sie habe nicht gefragt, für lock-free operation; Sie bat für Speicher Barrieren in den user-space. POSIX hat Sie; Sie werden als "pthread_mutex_lock", "pthread_mutex_unlock", etc. Sie können nicht wie das Modell hinter Ihnen, aber das ist, eine offizielle Antwort auf Ihre Frage.
Bitte beachten Sie das detail auf den Hinweis, den ich gab hier sagt,
Den [folgenden] gelieferten vorgesehen sind kompatibel mit denen in den Intel Itanium-Prozessor-spezifische Application Binary Interface, Abschnitt 7.4. Als solche, Sie fahren von der normalen GCC-Praxis "__builtin_" - Präfix, und weiter, dass Sie überlastet sind, so dass Sie arbeiten, auf mehrere Arten.
Ich bin nicht allzu vertraut mit diesem Thema. Ist das ein Prozessor-spezifischen Funktionen? (Da dein Beispiel ist ein Itanium...)
Im Allgemeinen sollten Benutzer nicht die Vorteile von Plattform - und compiler-spezifische Funktionen, wenn es standard, cross-platform-Mechanismen für die Erreichung der gleichen Wirkung. Was emg-2 wirklich braucht, ist die Verwendung der POSIX-threads (pthreads) Bibliothek.
Ich Stimme völlig mit Ihrer Meinung. Das ist der Grund für die Hervorhebung Plattform-spezifische Anmerkungen.
die posix-Bibliothek nicht mfence/sfence/lfence Operationen, soweit ich weiß. @nik: es ist erwähnenswert, dass die __sync_synchronize ist gebrochen vor GCC 4.4: gcc.gnu.org/bugzilla/show_bug.cgi?id=36793
Es ist nicht compiler-spezifisch, und weniger buggy als die GCC-Zeug. Es ist nicht ein giganto-Bibliothek, die bietet jede Menge Funktionalität, die Sie sich nicht kümmern. Es bietet nur Atomare Operationen. Außerdem ist es tragbar zu verschiedenen CPU-Architekturen.
Linux x64 heißt, Sie können mit dem Intel-memory-Barriere Anweisungen.
Vielleicht wickeln Sie Sie in Makros ähnlich wie in der Linux-Header, wenn
solche Makros sind nicht geeignet oder zugänglich sind, um Ihren code
Ich denke, dies ist die beste option. Der größte Fehler ist die erforderliche Wartung von unterschiedlichen Compilern und Vergangenheit/Zukunft/nicht-Intel-Prozessoren.
Also, was wollen Sie? Sie weiß nicht, wie die tragbare Lösung, und Sie weiß nicht, wie die Prozessor-spezifische.
Den Qprof profiling-Bibliothek (nichts zu tun mit Qt) auch in der its-source-code Bibliothek von atomaren Operationen, einschließlich memory-Barrieren. Sie arbeiten auf vielen Compilern und Architekturen. Ich verwende es auf einem Projekt von mir.
Den include/arch/qatomic_*.h - Header eines aktuellen Qt-distribution gehören (LGPL) code für eine Reihe von Architekturen, und alle Arten von memory-Barrieren (acquire, release, beide).
Posix definiert eine Anzahl von Funktionen als Speicherbarrieren. Speicherbereiche müssen nicht gleichzeitig zugegriffen werden; um dies zu verhindern, verwenden Sie die Synchronisierung - und, dass die Synchronisierung funktioniert auch als eine Barriere.
Du suchst die voll-memory-Barriere atomic gelieferten von gcc.
Bitte beachten Sie das detail auf den Hinweis, den ich gab hier sagt,
Verwenden libatomic_ops. http://www.hpl.hp.com/research/linux/atomic_ops/
Es ist nicht compiler-spezifisch, und weniger buggy als die GCC-Zeug. Es ist nicht ein giganto-Bibliothek, die bietet jede Menge Funktionalität, die Sie sich nicht kümmern. Es bietet nur Atomare Operationen. Außerdem ist es tragbar zu verschiedenen CPU-Architekturen.
Linux x64 heißt, Sie können mit dem Intel-memory-Barriere Anweisungen.
Vielleicht wickeln Sie Sie in Makros ähnlich wie in der Linux-Header, wenn
solche Makros sind nicht geeignet oder zugänglich sind, um Ihren code
__sync_synchronize()
im GCC-4.4+Dem Intel Whitepaper speicheranordnung, ein Abschnitt aus Band 3A der Intel 64 und IA-32-Handbuch http://developer.intel.com/Assets/PDF/manual/253668.pdf
Den Qprof profiling-Bibliothek (nichts zu tun mit Qt) auch in der its-source-code Bibliothek von atomaren Operationen, einschließlich memory-Barrieren. Sie arbeiten auf vielen Compilern und Architekturen. Ich verwende es auf einem Projekt von mir.
http://www.hpl.hp.com/research/linux/qprof/download.php4
Einfach Kreditaufnahme Barrieren definiert, die für den Linux-kernel, fügen Sie nur solche Makros verwenden, um Ihre header-Datei: http://lxr.linux.no/#linux+v3.6.5/arch/x86/include/asm/barrier.h#L21 . Und natürlich, geben Linux-Entwickler, Kredit in Ihrem source-code.
Den
include/arch/qatomic_*.h
- Header eines aktuellen Qt-distribution gehören (LGPL) code für eine Reihe von Architekturen, und alle Arten von memory-Barrieren (acquire, release, beide).