2009-05-30 11 views
11

Wdrażam mechanizm blokujący za pomocą atomowych (podwójne) instrukcji porównania i wymiany, np. cmpxchg16bOperacje atomowe C++ dla struktur bez blokady

Obecnie piszę o tym w zestawie, a następnie łączę go. Zastanawiałem się jednak, czy istnieje sposób na automatyczne wykonanie kompilatora dla mnie? na przykład blok kodu źródłowego z "atomowym" i spraw, aby zorientował się, jak zaimplementować kod jako instrukcję atomową w podstawowej architekturze procesora (lub wygenerować błąd podczas kompilacji, jeśli bazowy łuk go nie obsługuje)?

P.S. Wiem, że ma pewne gcc Zabudowy (przynajmniej dla CAS)

http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Atomic-Builtins.html#Atomic-Builtins

Odpowiedz

11

Już kindof odpowiedział here.

Standard C++ 0x zapewni niektóre typy atomic datatypes, głównie typu całkowitego i pustego, przy użyciu szablonu std :: atomic <. Ten artykuł wspomina o Boehm's atomic_ops project, który możesz pobrać i wykorzystać już dziś.

Jeśli nie, czy nie możesz zaimplementować swojego asemblera w kompilatorze? Wiem, że MSVC ma słowo kluczowe __asm dla wbudowanych procedur asemblera. Google mówi: yes, gcc can do it too.

+8

MSVC ma interlocked ops, a GCC ma wbudowane funkcje op-atomów, więc nie ma potrzeby wykonywania wbudowanego asemblera. Za pomocą obwolut kompilatora pozostaniesz przenośny na wszystkie platformy obsługiwane przez kompilator. – bdonlan

+0

MSVC ma blokowane operacje tylko dla długich typów danych, czyli jednostek zależnych OP. – gbjbaanb

+0

gcc nie ma wbudowanych opcji dla DWCAS. MSVC ma wbudowaną funkcję DWCAS. Żaden system operacyjny nie ma DW (podwójne słowo, np. Dwie długości wskaźnika, obok siebie) dla inkrementacji, dekrementacji itd. - DW istnieje tylko i istnieje tylko (i istnieje tylko dla CAS). –

5

przyszłości „C++ 0x” standardu C++ będzie wspierać operacje Atomowej & C - patrz np http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2007/n2427.html za rozsądną dyskusję. Dopóki ten przyszły standard nie zostanie zatwierdzony i szeroko wdrożony, oczywiście nie ma możliwości, aby taka funkcjonalność była "przenośna" w kompilatorach; jeśli interesują Cię określone kompilatory poza gcc, być może możesz otworzyć inne pytanie na ich temat.

+0

Nie jestem pewien, czy czegoś brakuje, ale link do artykułu nie wydaje się odpowiedni. – bugmenot77

+0

Masz rację, wkleiłeś zły adres URL - teraz edytujesz, by naprawić, dzięki! –

Powiązane problemy