Kafam karıştı. Uygulamanın yalnızca çalışma zamanında atomik olup olmadığını bilmesinin nasıl mümkün olabilir?Neden std :: atomic_is_lock_free statik bir konsoleks değil?
cevap
Derleyici, kodun hangi CPU üzerinde çalışacağını bilmeyebilir ve CPU'lar kilitleme yeteneklerinde farklılık gösterebilir. Örneğin, bir CPU, long
türlerinde atomik işlemleri desteklemeyebilir (ve böylece bir kilit gerekebilir), ancak sistemde yalnızca bir çekirdek varsa, bunlar otomatik olarak atomik olabilir, çünkü bunlar kesintiye uğramamakta ve başka çekirdeği yoktur. ile yarışmak (ve özel bir şey gerekmez ve tür kilit ücretsizdir).
Derleyici, CPU'nun kilit gerektirip gerektirmediğini bilemezse, oluşturulan kodun veri-yarışı için ücretsiz olmasını nasıl garanti eder? – ComicSansMS
@ComicSansMS Çalışma zamanında, kilitleme kodu veya kilitsiz kod kullanılıp kullanılmayacağına karar verilir. Tek çekirdek sistemler norm olduğunda, bunu her zaman yapan kod yazıyordum. –
Kullanıcı kodunda bunu neden yapmak istediğini anlayabiliyorum, ancak bir derleyicinin böyle bir kod oluşturması durumunda oldukça şaşırdım. Ancak, derleyici tek bir işlemciyi güvenli bir şekilde algılamak için kod üretebiliyorsa, bazı durumlarda geçerli bir optimizasyonun nasıl olacağını görebiliyorum. Bunu yapan derleyicileri biliyor musunuz? – ComicSansMS
- 1. Neden {}; `std :: forward_list` için geçerli değil?
- 2. Neden python statik/sınıf yöntemi callable değil?
- 3. Neden std :: oranı bir değer üyesine sahip değil?
- 4. Bu neden bir POD değil?
- 5. Neden ben değil statik bir kaynağın x ayarlayabilirsiniz: Adı xaml
- 6. Neden bir yeterlilik gerekli değil?
- 7. Statik alana neden statik bir şekilde erişilmelidir?
- 8. Neden std :: forward kullanmıyorsunuz?
- 9. Statik üye değişken başlatıcıda neden statik üye işlevi (global olan değil) denir?
- 10. Neden std :: mutex, CRITICAL_SECTION
- 11. Neden std :: function işlev_türü veya eşdeğer üye türüne sahip değil?
- 12. Neden bazı işlevler <cmath> std ad alanında değil?
- 13. Neden ayırma işlevleri std :: nothrow_t değerini değer yerine değil alır?
- 14. Neden bu basit program std :: rotate kullanarak derleme değil mi?
- 15. hata: 'sort' bir 'std' üyesi değil
- 16. hata: 'unique_ptr' bir 'std' üyesi değil
- 17. Neden ADL, std :: get
- 18. Neden std :: is_same
- 19. `std` modülü neden silinemedi?
- 20. Neden std :: protect yok?
- 21. std :: işlev değil derlenmiyor VS2012
- 22. Neden numpy std() matlab std() öğesine farklı bir sonuç verir?
- 23. std :: copy_n neden std :: size_t yerine bir şablon parametresi alıyor?
- 24. VHDL input dünya çapında bir statik değil
- 25. std :: statik olmayan üye işlevleri olan işlev
- 26. std :: move neden RVO'yu engeller?
- 27. Constexpr neden statik olmalı?
- 28. Python Statik yöntemler, neden?
- 29. Neden Statik Alanlar Serileştirilmemiş
- 30. Statik sınıflar neden mühürlendi?
[cppreference.com] 'daki (http://en.cppreference.com/w/cpp/atomic/atomic_is_lock_free) ilgili yorumları hizalanmış ve yanlış hizalanmış nesneler hakkında not alın. – Angew
Ayrıca derleme zamanında kontrol edebileceğiniz temel türler için 'ATOMIC_INT_LOCK_FREE' gibi makrolar da vardır. – interjay
@Angew evet, ama özellikle std :: atomic :: is_lock_free() 'yerine (std :: atomic_is_lock_free()') istedim. std :: atomic_is_lock_free' sadece türü bilir. Eğer tür kötü hizalamaya sahipse, çalışma zamanında bilinir. – GreenScape