2010-01-22 20 views
5

Burada paralel olarak birden çok iş parçacığından erişilen bazı C++ kodu. Kritik bir kesiti vardır: Kilit değişkeninin sınıfı, POSIX mutex uygulamasının etrafındaki sarıcıdır. Modül işlemleri nedeniyle atomik işlemlerin kullanılması mümkün değildir.Kilitle yeniden sıralama bildirimi

O3 bayrağına sahip bir gcc derleyicinin kodu optimize etmesi, böylece current_id ataması kilitlenmeden önce mi hareket ettirilir?

cevap

3

O3 ile derlemek mümkündür!

İşlev, işlev öznitelikleri kullanılarak tamamen işaretlenmedikçe, derleyici bir işlev çağrısı boyunca hiçbir zaman en iyileştirmeyecektir.

Muteks işlevleri saf değildir, dolayısıyla bunları O3 ile kullanmak kesinlikle güvenlidir.

+1

Yani, "fonksiyonun saf olarak işaretlenmediği veya derleyicinin bunu yapmanın güvenli olduğunu belirleyemediği **." Son sonuç aynıysa, derleyici, güvenli olduğunu doğrulayamadığı sürece genel olarak bir optimizasyon yapmaz. – jalf

+0

Eğer "current_id" ve "shared_id", geçerli kapsamdan kaçmayan yerel değişkenlerdir (adres). o zaman hiç kimseye verilmemiş, vs.) o zaman optimizatör, olası mutasyonu göz ardı ederek dış fonksiyon çağrılarından bu satırı yeniden sıralayabilirdi.Ayrıca, buradaki durumun bu olmadığını farzediyorum: – ephemient

+0

@ephemient: eğer yerel ve hayır ise dışardan biri, harici bir fonksiyon çağrısının onları nasıl değiştirdiğini bilir? – Kosi2801

1

Normalde derleyici bu tür zararlı optimizasyonlar yapmamalıdır. Hala emin değilseniz, o kimlik değişkenlerinde optimizasyonları önlemek için volatile anahtar sözcüğünü kullanabilirsiniz.

+0

uçucu tüm ilgili optimizasyonları önlemez. Değerin bir kayıtta önbelleğe alınmasını önler, ancak başka hiçbir şey yoktur. Okuma/yazma hala yeniden düzenlenebilir. – jalf

+0

Linux çekirdeği belgelerinin bir parçası olarak, ne zaman kullanılacağını iyi bir şekilde işleyin: http://www.mjmwired.net/kernel/Documentation/volatile-considered-harmful.txt – asveikau

+0

@jalf: ancak derleyiciler gerçekten yeniden okur/işlev çağrısı sınırlarını aşacaklarını yazar? Bir araya getirilen ödevler ve işlev çağrıları oldukça yaygındır ve sanırım değişkenlerin atanması işlev çağrıları ile düzeni değiştirebiliyorsa, her yerde çok fazla sorun olacaktır. – Kosi2801