2014-09-15 23 views
10

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?

+8

[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

+0

Ayrıca derleme zamanında kontrol edebileceğiniz temel türler için 'ATOMIC_INT_LOCK_FREE' gibi makrolar da vardır. – interjay

+0

@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

cevap

5

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).

+3

Derleyici, CPU'nun kilit gerektirip gerektirmediğini bilemezse, oluşturulan kodun veri-yarışı için ücretsiz olmasını nasıl garanti eder? – ComicSansMS

+0

@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. –

+0

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

İlgili konular