C ++ 11 standart yaddaş modeli təqdim etdi. Bu nə deməkdir? Və bu, C ++ proqramını necə təsir edəcək?

C ++ 11 standart bir yaddaş modeli təqdim etdi, amma bu tam olaraq nə deməkdir? Və bu, C ++ proqramını necə təsir edəcək?

Bu məqalə ( Gavin Klark, Herb Sutter sözlərinə istinadən) deyir

Yaddaş modeli, C ++ kodunun, dərhal kompilyatoru və hansı platformda işləyənlərdən asılı olmayaraq, zəng üçün standartlaşdırılmış bir kitabxanaya malik olduğunu bildirir. Müxtəlif mövzuların prosessor yaddaşına necə danışdığını nəzarət etmək üçün standart bir yol var.

"Kod [kod] 'nı standartda olan fərqli nüvələrə ayırmaqdan danışarkən yaddaş modeli haqqında danışırıq. İnsanlar kodu verəcəkləri aşağıdakı varsayımları pozmadan optimize edəcəyik" dedi Satter .

Bəli, internetdə mövcud olan bu və bənzər bəndləri xatırlaya bilərik (doğum anından öz yaddaş modelim olduğundan) və hətta başqalarının soruşduğu suallara cavab yaza bilərəm, amma dürüstəm ki, mən dəqiq deyiləm Bunu başa düşürəm.

C ++ proqramçıları daha çox işlənmiş proqramları daha da inkişaf etdirmək üçün istifadə edirdi, belə ki POSIX mövzuları və ya Windows iş parçacığı və ya C ++ 11 mövzuları nə qədər vacibdir? Fayda nədir? Aşağı səviyyədə olan detalları anlamaq istəyirəm.

Mən də C ++ 11 yaddaş modelinin C ++ 11 üçün multi-threading dəstəyi ilə bağlı olduğunu hiss edirəm, çünki bu ikisini birlikdə tez-tez görürəm. Əgər belədirsə, necə? Niyə əlaqəlidir?

Bir çox mövzuların necə işlədiyini və yaddaş modelinin bütünlüklə necə işlədiyini bilmirəm, mənə bu anlayışları anlamaqda kömək edin. :-)

1625
12 июня '11 в 2:30 2011-06-12 02:30 Nawaz , 12 İyun tarixində saat 11: 30- da təyin olunub 2011-06-12 02:30
@ 6 cavablar

Birincisi, dil ilə bir vəkil kimi düşünməyi öyrənməlisiniz.

C ++ spesifikasiyası hər hansı bir kompilyator, əməliyyat sistemi və ya prosessora aid deyildir. O, real sistemlərin ümumiləşdirilməsi olan soyuducu bir maşına istinad edir. Hüquqşünaslar dünyasında bir proqramçı işi soyut bir maşın üçün kod yazmaqdır; kompilyatorun işi bu kodu xüsusi bir maşın üzərində tətbiq etməkdir. Spesifikasiyanı ciddi şəkildə kodlaşdırırsanız, kodunuz kompilyasiya ediləcək və hər hansı bir sistemdə dəyişikliklər etməyinizə əmin ola bilərsiniz, bu gün və ya 50 il sonra.

C ++ 98 / C ++ 03 xüsusiyyətindəki soyut maşın əsasən yalnış işıqlandırılmışdır. Beləliklə, çox funksiyalı C ++ kodu yazmaq mümkün deyil, bu, tamamilə dəqiqləşdirmə əsasında ötürülür. Xüsusiyyətlər yüklərin atomikliyi və yaddaşın saxlanması və ya yüklənmə və saxlama qaydası haqqında heç bir şey söylemir, mutexes kimi şeyləri qeyd etməyəcəkdir.

Əlbəttə ki, xüsusi sistemlər üçün praktikada çox işlənmiş kod yaza bilərsiniz - məsələn, pthreads və ya Windows. C ++ 98 / C ++ 03 üçün çox yivli kod yazmaq üçün standart bir yol yoxdur.

Soyut maşın C ++ 11 multi-thread dizaynı. Həmçinin yaxşı müəyyən yaddaş modeli var; yəni kompilyator yaddaşa çıxdıqda bunu edə və edə bilməyəcəyini deyir.

Bir cüt qlobal dəyişənlərin eyni anda iki mövzu ilə əldə edildiyi aşağıdakı nümunəni nəzərdən keçirin:

  Global int x, y; Thread 1 Thread 2 x = 17; cout << y << " "; y = 37; cout << x << endl; 

Mövzu 2 nə çıxara bilər?

C ++ 98 / C ++ 03-də bu, hətta qeyri-müəyyən davranış deyil; Sualın özü mənasızdır, çünki standart bir "mövzu" deyilən bir şey hesab etmir.

C ++ 11-də nəticələr qeyri-müəyyən davranışdır, çünki yüklər və mağazaların heç bir atomu olmamalıdır. Çox yaxşı bir inkişaf kimi görünə bilməz ... Və özü də bu deyil.

Lakin C ++ 11 ilə aşağıdakıları yaza bilərsiniz:

  Global atomic<int> x, y; Thread 1 Thread 2 x.store(17); cout << y.load() << " "; y.store(37); cout << x.load() << endl; 

İndi hər şey daha da maraqlı olur. Əvvəlcə davranış burada müəyyənləşdirilir. Mövzu 2 artıq 0 0 (1 mövzu əvvəl işlədilirsə), 37 17 (1-ci mövzu sonra işlədilsə) və ya 0 17 çap edə bilər (əgər mövzu 1 x-lərdən sonra başlayırsa, ).

C ++ 11-də atom yüklərinin / saxlanmanın standart rejimi ardıcıl davamlılığı təmin etməkdir, çünki çap edilə bilməyən nədir 37 0 . Bu deməkdir ki, bütün yüklər və saxlanmalar "sanki" olmalı, onlar hər axında qeyd etdiyiniz qaydada meydana gələr, axınlar arasında əməliyyatlar alternativ ola bilər, amma sistem xoşdur. Beləliklə, Atomics-in standart davranışı həm atomikliyi, həm də yükləmə və saxlama qaydasını təmin edir.

İndi müasir bir prosessorda ardıcıl davamlılığı təmin etmək çox bahalı ola bilər. Xüsusilə, kompilyator, burada hər bir giriş arasında tam miqyaslı yaddaş bariyerlərini yayır. Ancaq alqoritminiz yönetilmeyen yük və mağazalara dözə bilər; yəni, əgər atomikliyə ehtiyac olsa, sifariş vermir; yəni, bu proqramdan çıxış olaraq 37 0 çıxarsa, bu yaza bilərsiniz:

  Global atomic<int> x, y; Thread 1 Thread 2 x.store(17,memory_order_relaxed); cout << y.load(memory_order_relaxed) << " "; y.store(37,memory_order_relaxed); cout << x.load(memory_order_relaxed) << endl; 

Daha müasir prosessor, daha çox əvvəlki nümunədən daha sürətli olacaq.

Nəhayət, müəyyən yüklərin və mağazaların qaydada saxlanmasına ehtiyacınız varsa, yaza bilərsiniz:

  Global atomic<int> x, y; Thread 1 Thread 2 x.store(17,memory_order_release); cout << y.load(memory_order_acquire) << " "; y.store(37,memory_order_release); cout << x.load(memory_order_acquire) << endl; 

Bu, bizi sifarişli yüklərə və mağazalara qaytarır - belə ki, 37 0 artıq mümkün bir çıxışdır, amma bu, minimal yüklənmə ilə mümkündür. (Bu qeyri-adi nümunədə, nəticə tam miqyaslı ardıcıl tutarlılıq ilə eynidır, böyük bir proqramda bu baş verməyəcəkdir).

Əlbəttə ki, yalnız 0 0 və ya 37 17 , görünmək istədiyiniz nəticələr, bir qaynaq kodunu ətrafında bir mutex udmaq olar. Amma uzaqdan oxuduğunuz təqdirdə, necə əməl etdiyini bildiyinizə əminəm və bu cavab mən düşündüyümdən çoxdur :-).

Belə ki, alt xətt. Mutexes böyükdür və C ++ 11 onları standartlaşdırır. Ancaq bəzən performans səbəbləri üçün aşağı səviyyəli primitivlərə ehtiyac var (məsələn, ikiqat kilid yoxlanışı ilə klassik bir model ). Yeni standart mutexes və dövlət dəyişənləri kimi yüksək səviyyəli cihazları təmin edir və həmçinin atom tipləri və müxtəlif yaddaş qorunması variantları kimi aşağı səviyyəli cihaz təmin edir. Beləliklə, indi standartın müəyyən etdiyi dildə tamamilə yüksək səviyyəli kompleks yüksək parallel rutinlər yaza bilərsiniz və kodunuz həm günümüzdə, həm də sabahındakı dəyişiklik olmadan tərtib və işləyəcəkdir.

Səmimi olmağınıza baxmayaraq, əgər siz ekspert deyilsinizsə və bəzi ciddi aşağı səviyyəli kodlarla işləmirsinizsə, ehtimal ki, mutexes və dəyişən şərtlərə riayət etməlisiniz. Bunu etmək niyyətindəyəm.

Daha ətraflı məlumat üçün bu blog yazısına baxın.

1877
12 июня '11 в 3:23 2011-06-12 03:23 cavab Nemo tərəfindən 12 İyun '11 'də 3:23' də verildi. 2011-06-12 03:23

Mən sadəcə yaddaşın ardıcıllıq modelini (ya da yaddaş modelini, qısa) başa düşdüyüm bir oxşarlıq verəcəyəm. O, Lesley Lamportun semantik kağızından " Müəyyən bir sistemdə hadisələrin vaxtı, saatları və əmrləri" ilə ilhamlanır. Analoji və müvafiq əhəmiyyət daşıyır, lakin bir çox insanlar üçün lazımsız ola bilər. Ancaq ümid edirəm ki, bu, yaddaş qüsursuzluq modelləri barədə daha asan düşünməyə imkan verən zehni bir şəkil (qrafik təmsil) verir.

Horizontal oxun ünvanı yerini təmsil edən (məsələn, hər bir yaddaş hüceyrəsi bu oxda bir nöqtə ilə təmsil olunur), yerin vaxt diaqramında bütün yaddaş yerlərinin tarixini nəzərdən keçirmək imkanı verir və şaquli eksen vaxt deməkdir (ümumiyyətlə, , zamanın universal anlayışı yoxdur). Beləliklə, hər bir yaddaş hücresində saxlanan dəyərlərin tarixi bu yaddaş ünvanında şaquli bir sütun ilə təmsil olunur. Qiymətin hər bir dəyişməsi mövzuların birinin bu yerə yeni bir dəyər yazdığına bağlıdır. Yaddaş görünüşü altında, müəyyən bir axından istifadə edərək, müəyyən bir zamanda müşahidə olunan bütün yaddaş yerlərinin dəyərlərinin / birləşməsini başa düşəcəyik.

"Davamlılıq və Cache uyğunluq qurucusu" dan sitat

Seksual (və məhdudlaşdıran) yaddaş modeli, birdən çox iş parçacığının yerinə yetirilməsi, hər bir kompozit ipin ardıcıl yerinə yetirilməsinin dəyişməsi kimi görünən ardıcıllıqlı ardıcıllıqdır (SC), sanki iplər təkmüddətli bir prosessorda vaxt möhkəmlənmişdir.

Bu qlobal yaddaş sırası bir proqramdan digərinə fərqlənə bilər və əvvəlcədən bilinməyəcəkdir. SC'nin xarakterik xüsusiyyəti simultane təyyarələri təmsil edən yer-kosmik vaxt diaqramında (yəni yaddaşda olan görüntülər) birbaşa üfüqi dilimlərdən ibarətdir. Bu təyyarədə bütün hadisələr (ya da yaddaş dəyərləri) eyni vaxtda olur. Bütün mövzuların yaddaş dəyərlərinin eyni vaxtda olduğu ilə razılaşdığı mütləq vaxt anlayışı var. SC-də bütün dövrlərdə ümumi olan bir zamanda yalnız bir yaddaş görünüşü var. Yəni, hər anda bütün prosessorlar yaddaşın təsviri ilə (yəni ümumi yaddaş tərkibləri) uyğun gəlir. Bu, bütün mövzuların bütün yaddaş yerləri üçün eyni ardıcıllığı göstərməsini, eyni zamanda bütün prosessorların bütün dəyişənlər üçün eyni dəyərlər birləşməsini işlətməsini nəzərdə tutur. Bütün yaddaş əməliyyatları (bütün yaddaş hüceyrələrində) bütün iş parçaları ilə eyni tam qaydada müşahidə olunur.

Zəif yaddaşlı modellərdə, hər bir mövzu yer-boşluq vaxtını özü ilə ayırır, yalnız məhdudlaşdırma, hər bir axının kəsilməsinin bir-biri ilə kəsişməsidir, çünki bütün mövzuları hər bir fərdi yaddaş hücresinin tarixinə uyğun olmalıdır (əlbəttə ki, bir-biri ilə qovuşacaq və kəsəcək). Bunu kəsmək üçün universal bir yol yoxdur (ünvan yer-zamanının imtiyazlı foliasiyası olmadan). Dilimlər düz olmalıdır (və ya xətti). Onlar əyri ola bilər və bu oxuduğu başqa bir axınla yazılmış axın dəyərlərini, yazdıqları yerdən edə bilər. Müxtəlif yerlərdəki hekayələr hər hansı bir xüsusi axını görüntüləyərkən bir- birinə xas olan nisbətdə sürüşməyə (ya da uzanmağa) imkan verə bilər. Hər bir mövzuya hadisələrin (ya da bərabər yaddaş dəyərlərinin) eyni anda olduğu fərqli bir fikri olacaq. Eyni zamanda bir axınla əlaqəli olan hadisələr (və ya yaddaş dəyərləri) digərləri ilə eyni vaxtda deyil. Beləliklə, zəifləmiş yaddaş modelində, bütün mövzuları hər bir yaddaş yeri üçün eyni tarixə (yəni dəyərlər ardıcıllığı) malikdir. Ancaq onlar yaddaşın müxtəlif görünüşlərini (yəni bütün yaddaş yerlərinin dəyərlərinin kombinasiyası) müşahidə edə bilərlər. İki fərqli yaddaş yerləri birbaşa eyni axın tərəfindən qeydə alınsa belə, digər yeni axınlar tərəfindən fərqli bir qaydada iki yeni qeydə dəyərlər müşahidə edilə bilər.

[Wikipedia təsvirləri]

Einsteins Special Relativity ilə tanış olan oxucular mənim haqqında danışdığım şeyi görəcəksiniz. Minkowski sözlərinin yaddaş modellərinə tərcüməsi: ünvan sahəsi və vaxtı ünvanı yer-zamanının kölgələri. Bu halda, hər bir müşahidəçi (məsələn, Akış) hadisənin kölgələri (yəni yaddaş / yükləri yadda saxlayır) dünyanın öz xəttinə (yəni, onun vaxt oxuna) və öz simultane təyyarəsini (ünvanı məkanın ekseni) C ++ 11 yaddaş modelindəki mövzular xüsusi nəzəriyyə nəzəriyyəsində bir-birinə nisbətən hərəkət edən müşahidəçilərə cavab verir. Ardıcıl tutarlılıq Cəlilidə uzay- zamanına uyğun gəlir (yəni bütün müşahidəçilər hadisələrin bir mütləq qaydası və eyni vaxtda bir qlobal mənada razılaşırlar).

border=0

Yaddaş modelləri ilə nisbi nisbətin xüsusi nəzəriyyəsi arasındakı oxşarlıq, hər ikisi də tez-tez bir nedensel set kimi adlandırılan, qismən sifarişli bir sıra müəyyən edirlər. Bəzi hadisələr (yəni, Saxlama) digər hadisələri (lakin təsir etməyəcək) təsir edə bilər. C ++ 11 hərəkəti (və ya fizika müşahidəçisi) hadisələrin bir zəncirindən (yəni, tam sifariş edilmiş dəstdən) başqa bir şey deyildir (məsələn, yaddaş yükləri və ehtimalları fərqli ünvanlara qədər).

Nisbilik nəzəriyyəsində, bəzi müşahidəçilərin razılaşdıqları tək vaxt sərəncamı "müvəqqəti hadisələr" arasında (yəni, prinsipcə hər hansı bir hissəcik ilə əlaqələndirilə bilən hadisələr) sifariş olunduğu üçün, qismən sifariş edilmiş hadisələrin görünən xaotik görünüşünə bərpa olunur bir vacuumda işıq sürətindən daha yavaş). Yalnız vaxtlı hadisələr invariantly sifariş edilir. Fiziki zaman, Craig Callender .

C ++ 11 yaddaş modelində oxşar bir mexanizm (tutarlılıq-azad-azad model) bu yerli nedensel əlaqələri yaratmaq üçün istifadə olunur.

Xəttin ardıcıllığının və SC-dən imtina motivasiyasının müəyyənləşdirilməsini təmin etmək üçün, mənim yaddaşımdan tutuşma və önbelleğin tutarlılığı haqqında Astaradan verəcəyəm

Paylaşılan bir yaddaş kompüteri üçün, yaddaş tutarlılığı modeli yaddaş sisteminin architecturally görünür davranışını müəyyən edir. Tek bir işlemci çekirdeğinin doğruluğunun ölçütü, "bir doğru sonucu" ve "bir çox düzensiz alternatif" arasında davranışı ayırır. Bu, prosessorun arxitekturası işin yerinə yetirilməsini müəyyən edilmiş giriş vəziyyətini hətta bir nüvədən xaricində hətta yaxşı müəyyən edilmiş bir çıxış halına çevirdiyini təmin edir. Bununla birlikdə, paylaşılan yaddaş ilə uyğunluq modelləri bir çox mövzuların yükləri və saxlanması ilə bağlıdır və bir çox (daha çox) səhv olanları aradan qaldırmaq üçün adətən bir çox düzgün icra etməyə imkan verir. Çoxsaylı düzəlişlərin ediləcəyi ehtimal ISA-nın bir çox iş parçasının eyni vaxtda yerinə yetirilməsinə imkan verdiyindən, tez-tez fərqli mövzulardan olan əmrlərin çoxlu qanuni pozuntularına səbəb olur.

Rahat və ya zəif yaddaş tutarlılığı modelləri güclü modellərdə ən çox yaddaş sifarişlərinə ehtiyac olmadığı üçün motivasiya edilir. Dere on veri elementini və sonra sinxronizasiya bayrağını yeniləyirsə, proqram elementləri üçün məlumat elementləri bir-birinə nisbətən uyğun olaraq gündəmdədir və yalnız bayraq yenilənməmişdən əvvəl bütün məlumat elementləri yenilənir (bunlar adətən FENCE təlimatı ilə tətbiq olunur). Rahat modellər, bu artmış sifarişli esnekliği yakalamak eğilimindedir ve hem daha yaxşı performansı hem de SC doğruluğunu elde etmek üçün programcıların "gereksinim duyduğu" sifarişleri tutur. Məsələn, bəzi memarlıqlarda FIFO yazma tamponları hər bir çekirdek tərəfindən nəticələrin önbelleklere yazılmasından əvvəl sabit (məsafədən) saxlanılan məhsulların saxlanması üçün istifadə olunur. Bu optimallaşdırma performansını yaxşılaşdırır, lakin SC pozur. Yazma tamponu, mağaza daşınmalarında gecikməni gizlədir. Mağazaların ümumi olduğu üçün onların əksəriyyətinin dayandırılmasının qarşısını almaq vacib bir üstünlükdür. Tək çekirdekli bir prosessor üçün, yazma tamponu yazı tamponundakı bir və ya daha çox yaddaşı olsa da, A ünvanının A ən son saxlanmanı A'ya qaytarmasını təmin etmək üçün arxitektura görünməz ola bilər. Bu, adətən, A-dan ən son saxlanmanın dəyərini A-dan yükə keçirməklə həyata keçirilir, burada "son" proqramın sifarişinə əsasən müəyyən edilir və ya saxlama A yazma tamponunda olarsa, A yükünü dayandırır. . Yazma arabellekleri olmadan, donanım SC'dir, lakin yazma tamponları ilə, bu, çox çekirdekli bir işlemcide mimari görünen yazma arabelleklerini yapan bir durum deyildir.

Mağaza əsaslı saxlanmanın yenidən qurulması, çekirdeklerin FIFO-dan fərqli bir yazma tamponu olduğu halda, mağazaların girildikləri sıradan fərqli bir şəkildə ayrılmasına imkan verəcəkdir. İlk mağaza önbellekti, ikincisi isə ikinci mağazanın əvvəlki mağaza ilə (yəni, birinci mağazadan əvvəl) birləşdirə biləcəyi halda baş verə bilər. Yükün yenidən planlaşdırılması da proqramdan təlimatları yerinə yetirən dinamik olaraq təyin edilmiş çekirdeklərdə də baş verə bilər. Bu fərqli bir nüvədə mağazaların yenidən sıralanması ilə eyni şəkildə davranıla bilər (iki axın arasındakı dəyişkənliyin nümunəsini düşünürsən?). Saxlanmanın ardından saxlanması (yığma-yüklənmənin yenidən qurulması) ilə erkən yüklənmənin yenidən təyin edilməsi, kilidi buraxdıqdan sonra dəyər saxlayaraq (saxlama kilidləmə əməliyyatı olduqda) bir çox səhv addımlara səbəb ola bilər. Qeyd edək ki, depoda yenidən sıralanma, proqramın icrası sırasındakı bütün əmrləri yerinə yetirən çekirdeklə olsa da, yayılmış tətbiq olunan FIFO yazma tamponundakı bir yerli tarama görə də baş verə bilər.

Önbellek tutarlılığı və yaddaş tutarlılığı bəzən qarışıq olduğundan, bu qiymətə sahib olmaq üçün təlimat verilir:

Tutarlılıqdan fərqli olaraq, proqram və ya sorguda önbellek tutarlılığı göstərilir. Uyğunluq paylaşılan yaddaş sisteminin önbelleğinin funksiyaları bir təkamül sistemində önbellek olaraq görünmemesini təmin etməkdir. Правильная согласованность гарантирует, что программист не может определить, имеет ли и где система кэширует, анализируя результаты нагрузок и хранилищ. Это связано с тем, что правильная когерентность гарантирует, что кэши никогда не будут включать новое или другое поведение функционировать (программисты могут все еще иметь возможность вывести вероятную структуру кэша, используя информацию время ). Основная цель протоколов когерентности кеша - поддерживать инвариант одиночного писателя-множественного считывателя (SWMR) для каждой ячейки памяти. Важным различием между согласованностью и согласованностью является то, что согласованность указана в на основе расположения памяти , тогда как согласованность указана в отношении местоположений памяти all .

Продолжая нашу ментальную картину, инвариант SWMR соответствует физическому требованию, чтобы в одной точке находилось не более одной частицы, но может быть неограниченное количество наблюдателей любого местоположения.

298
ответ дан Ahmed Nassar 29 авг. '13 в 23:42 2013-08-29 23:42

Теперь это многолетний вопрос, но, будучи очень популярным, стоит упомянуть фантастический ресурс для изучения модели памяти С++ 11. Я не вижу смысла подытоживать его разговор, чтобы сделать этот еще один полный ответ, но учитывая, что это тот парень, который на самом деле написал стандарт, я думаю, что стоит посмотреть разговор.

Herb Sutter имеет трехчасовой разговор о модели памяти С++ 11 под названием "атомное оружие", доступное на сайте Channel9 - часть 1 и часть 2 . Разговор довольно технический и охватывает следующие темы:

  1. Оптимизации, расы и модель памяти
  2. Заказ - Что: Приобретать и выпускать
  3. Заказ - Как: Мьютекс, Атомная техника и/или Заборы
  4. Другие ограничения на компиляторы и аппаратные средства
  5. Код Gen Performance: x86/x64, IA64, POWER, ARM
  6. Расслабленная атомная энергия

В разговоре не говорится об API, а скорее о рассуждениях, предпосылках под капотом и за кулисами (знаете ли вы, что смягченная семантика была добавлена к стандарту только потому, что POWER и ARM не поддерживают синхронизированную нагрузку эффективно?).

88
ответ дан eran 20 дек. '13 в 16:22 2013-12-20 16:22

Это означает, что стандарт теперь определяет многопоточность, и он определяет, что происходит в контексте нескольких потоков. Конечно, люди использовали различные реализации, но это, как и вопрос о том, почему мы должны иметь std::string , когда мы все могли бы использовать класс, состоящий из класса string .

Когда вы говорите о потоках POSIX или потоках Windows, это немного иллюзия, поскольку вы говорите о потоках x86, так как это аппаратная функция для запуска одновременно. Модель памяти С++ 0x дает гарантии, будь вы на x86 или ARM, или MIPS , или что-нибудь еще, что вы можете придумайте.

69
ответ дан Puppy 12 июня '11 в 2:42 2011-06-12 02:42

Для языков, не определяющих модель памяти, вы пишете код для языка и модель памяти, указанную в архитектуре процессора. Процессор может выбрать способ переназначения доступа к памяти для производительности. Итак, , если ваша программа имеет расы данных (гонка данных - это когда возможно одновременное обращение к нескольким ядрам/гиперпотокам к одной и той же памяти), то ваша программа не является перекрестной платформой из-за ее зависимости от процессор. Вы можете обратиться к руководствам по программному обеспечению Intel или AMD, чтобы узнать, как процессоры могут повторно заказать доступ к памяти.

Очень важно, что блокировки (и concurrency семантики с блокировкой) обычно реализуются кросс-платформенным способом... Поэтому, если вы используете стандартные блокировки в многопоточной программе без расчётов данных, вы не выполняете приходится беспокоиться о моделях памяти с межплатформенной платформой .

Интересно, что компиляторы Microsoft для С++ имеют семантику получения/выпуска для volatile, которая является расширением С++, чтобы справиться с отсутствием модели памяти в С++ http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.80).aspx . Однако, учитывая, что Windows работает только на x86/x64, это не говорит о многом (модели памяти Intel и AMD позволяют легко и эффективно реализовать семантику получения/выпуска на языке).

50
ответ дан ritesh 26 июля '11 в 7:27 2011-07-26 07:27

Если вы используете мьютексы для защиты всех ваших данных, вам действительно не нужно беспокоиться. Мьютексы всегда обеспечивали достаточные гарантии порядка и видимости.

Теперь, если вы использовали атомы или алгоритмы блокировки, вам нужно подумать о модели памяти. Модель памяти точно описывает, когда атомистика обеспечивает гарантии порядка и видимости и обеспечивает переносные ограждения для гарантированных вручную гарантий.

Ранее атомы выполнялись с использованием встроенных средств компилятора или некоторой библиотеки более высокого уровня. Заборы были бы выполнены с использованием инструкций, специфичных для процессора (барьеров памяти).

23
ответ дан ninjalj 12 июня '11 в 2:49 2011-06-12 02:49

Другие вопросы по меткам > или Задайте вопрос