SORU
20 Mart 2010, CUMARTESİ


Neden uçucu yararlı birden çok iş parçacığı C veya C programlama olarak kabul edilmez?

this answer gösterildiği gibi geçenlerde programı hakkında karıştı (veya bunların eksikliği) çok parçacıklı programlama bağlamlarda volatile gibi görünüyorum gönderildi.

Benim anladığım şu: bir değişken kod erişim parçasının akış denetiminin dışında değiştirilebilir, değişken volatile beyan edilmesi gereken herhangi bir zaman. Sinyal işleyicileri, O kaydeder ve değişkenleri başka bir iş parçacığı tarafından değiştirilebilir gibi durumlar oluşturmaktadır.

Bu yüzden, eğer bir global int foo, foo okuma ile bir iş parçacığı ve set atomik başka bir iş parçacığı (muhtemelen kullanarak uygun bir makine talimat), okuma parçacığı görür bu durumda aynı şekilde gördüğü bir değişken eşimin tarafından bir sinyal işleyicisi veya değiştiren bir dış donanım koşul ve böylece foo belirtilmelidir volatile (veya birden çok iş parçacığı durumlarda, erişilebilir bellek-çit yük, ki muhtemelen daha iyi bir çözüm).

Nasıl ve nerede hata yapıyorum?

CEVAP
20 Mart 2010, CUMARTESİ


Çok iş parçacıklı bir bağlamda volatile sorunu sağlamaztümbu ihtiyacımız garanti eder. volatile güvenemeyiz . bu yüzden ihtiyacımız olan birkaç özellikleri, ama hepsi değilyalnız.

Ancak, ilkel biz için kullanmak zorundakalanözellikler volatile mu olanları sağlamak, etkili gereksizdir.

Evresel paylaşılan verilere erişimi için bir garanti ihtiyacımız var:

  • okuma/gerçekte derleyici sadece bir kayıt değeri yerine mağaza ve çok sonrasına kadar ana bellek güncelleme erteleme olmayacak (yaz)
  • hiçbir yeniden düzenlenmesi yer alır. Ya da bazı veri okuma için hazır olup olmadığını belirten bir bayrak gibi volatile bir değişken kullanıyoruz varsayalım. Kod örneğimizde, biz sadece verileri, çok hazırladıktan sonra bayrakgörünüyorgüzel. Ama eğer talimatları bayrağı ayarlanmışsa, yeniden ne olurilk?

volatile ilk nokta garanti. Ayrıca yeniden oluşur güvence altına alırfarklı buharlaşma arasındaki okur/yazar. volatile tüm bellek erişir belirtilen sırada ortaya çıkar. Hepsi için ne lazım volatile yöneliktir: işleme I/O kayıtları veya küçültülmesi donanım, ama bir işimize yaramıyor, çok iş parçacıklı kod nerede volatile nesne genellikle sadece kullanılan senkronize erişmek için uçucu olmayan veri. O erişir hala volatile olanlara göre yeniden düzenlenebilir.

Yeniden önlemek için bir çözüm kullanmaktırhafıza bariyerderleyici ve İŞLEMCİ olduğunu gösterir ., ^em>hayır bellek erişimi bu nokta üzerinden yeniden olabilir. Uçucu değişken erişim etrafında bu engelleri yerleştirerek bile uçucu olmayan erişir uçucu denk, bize iş parçacığı için güvenli kod yazmak için izin, yeniden olmayacak sağlar.

Ancak, hafıza engellerayrıca/yazar tüm bekleyen okur bariyer ulaşılır, etkili bir şekilde kendisi tarafından bize ihtiyacımız olan her şeyi veriyor, volatile gereksiz ve uygulanmasını sağlamak. Sadece volatile niteleyici tamamen kaldırabiliriz.

C beri 11, atomik değişkenler (std::atomic<T>) ilgili Teminatlar vermek.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DroidModderX ROOT Master

    DroidModderX

    14 ŞUBAT 2011
  • Matthew Morrill

    Matthew Morr

    15 EKİM 2011
  • stewmurray47

    stewmurray47

    1 Kasım 2006