Bir baktıktan sonra demet ait diğer sorular ve bunların cevapları , ben izlenimini almak C "uçucu" anahtar kelime tam olarak ne anlama geldiği konusunda yaygın bir görüş birliği vardır.
Standardın kendisi bile herkesin ne anlama geldiği konusunda anlaşacak kadar net görünmüyor .
Diğer sorunların yanı sıra:
- Donanımınıza ve derleyicinize bağlı olarak farklı garantiler sağlıyor gibi görünüyor.
- O kadar kendi çalışma zamanı optimizasyonlar yapar gelişmiş bir işlemci üzerinde, derleyici optimizasyonlar ancak donanım optimizasyonlar etkiler, hatta derleyici olmadığını belli değil edebilirsiniz sen engellemek istediğini optimizasyon önler. (Bazı derleyiciler, bazı sistemlerde bazı donanım optimizasyonlarını önlemek için talimatlar oluşturur, ancak bu herhangi bir şekilde standartlaştırılmış görünmemektedir.)
Sorunu özetlemek gerekirse, (çok fazla okuduktan sonra) "değişken" gibi bir şeyi garanti ettiği anlaşılmaktadır : Değer yalnızca bir kayıttan / kayıt defterine değil, en azından çekirdeğin L1 önbelleğine, aynı sırayla okunacak / yazılacaktır. kodda okuma / yazma görünür. Ancak bu bir işe yaramaz görünmektedir, çünkü bir kayıttan / bir kayda okuma / yazma aynı iş parçacığı içinde zaten yeterlidir, L1 önbelleği ile koordinasyon diğer iş parçacıklarıyla koordinasyon hakkında daha fazla bir şey garanti etmez. Sadece L1 önbellek ile senkronizasyonun ne zaman önemli olabileceğini hayal bile edemiyorum.
KULLANIM 1
Yaygın olarak kabul edilen tek uçucu madde kullanımı, belirli bellek konumlarının I / O işlevlerine donanımsal olarak eşleştirildiği (doğrudan donanımda) ışığı kontrol eden bir parça gibi eski veya gömülü sistemler için olduğu görülmektedir. veya bir klavye tuşunun kapalı olup olmadığını söyleyen bellekte biraz (donanım tarafından doğrudan tuşa bağlı olduğu için).
Gibi görünüyor "kullanım 1" olan hedefleri çok çekirdekli sistemleri bulunmaktadır taşınabilir kodunda oluşmaz.
KULLANIM 2
"1'i kullan", kesme işleyicisi tarafından herhangi bir zamanda okunabilen veya yazılabilen bellektir (bir ışığı kontrol edebilir veya bir anahtardan bilgi depolayabilir). Ancak zaten bunun için, sisteme bağlı olarak, kesme işleyicisinin kendi bellek önbelleği ile farklı bir çekirdek üzerinde çalışabileceği ve "geçici" nin tüm sistemlerde önbellek tutarlılığını garanti etmediği sorunu var.
Yani "kullanım 2", "uçucu" nun sağlayabileceğinin ötesinde görünüyor.
KULLANIM 3
Gördüğüm diğer tartışmasız kullanım, derleyicinin fark etmediği aynı belleğe işaret eden farklı değişkenler aracılığıyla erişimin yanlış optimizasyonunu önlemektir. Ama bu muhtemelen tartışmasız çünkü insanlar bunun hakkında konuşmuyor - sadece bir söz gördüm. Ve C standardının zaten "farklı" işaretçilerin (bir işleve farklı argümanlar gibi) aynı öğeyi veya yakındaki öğeleri işaret edebileceğini ve derleyicinin bu gibi durumlarda bile çalışan kod üretmesi gerektiğini zaten düşündüğünü düşündüm. Ancak, bu konuyu en son (500 sayfa!) Standardında hızlı bir şekilde bulamadım.
Yani "3'ü kullan" belki hiç yoktur ?
Dolayısıyla sorum:
"Uçucu", çok çekirdekli sistemler için taşınabilir C kodunda hiçbir şeyi garanti etmiyor mu?
EDIT - güncelleme
En son standarda göz attıktan sonra , cevap en azından çok sınırlı bir evet gibi görünmektedir :
1. Standart, "uçucu sig_atomic_t" tipi için özel muameleyi tekrar tekrar belirtir. Bununla birlikte standart, sinyal işlevinin çok iş parçacıklı bir programda kullanılmasının tanımsız davranışa neden olduğunu da belirtmektedir. Dolayısıyla bu kullanım durumu, tek iş parçacıklı bir program ile sinyal işleyicisi arasındaki iletişim ile sınırlı görünmektedir.
2. Standart ayrıca setjmp / longjmp ile ilişkili olarak "uçucu" için açık bir anlam belirtir. (Önemli olan örnek kod diğer soru ve cevaplarda verilmiştir .)
Böylece daha kesin soru şu olur:
"Uçucu", (1) tek iş parçacıklı bir programın sinyal işleyicisinden bilgi almasına izin vermek veya (2) setjmp'a izin vermek dışında, çok çekirdekli sistemler için taşınabilir C kodunda hiçbir şeyi garanti etmez mi? ve longjmp arasında değiştirilen değişkenleri görmek için kod?
Bu hala evet / hayır sorusu.
Eğer "evet" ise, "uçucu" atlanırsa buggy haline gelen bir hata içermeyen taşınabilir kod örneği göstermeniz harika olur. Eğer "hayır" ise, bir derleyici bu çok özel iki durumun dışında "uçucu" yu çok çekirdekli hedefler için göz ardı etmekte serbesttir.
volatile
özellikle gerekli olduğuna inandığım hakkında.
volatile
, programı eşzamansız olarak değişebileceği konusunda bilgilendirmesi gerekir .