Bir C++ Linux uygulamasında, Win32 üzerinde Interlocked işlevlerinin sağladığı işlevselliği almanın en kolay yolu nedir? Özellikle, atomik artış veya 32 veya 64 bit tam sayı eklemek için hafif bir yol?Linux üzerinde birbirine eşdeğer eşdeğer
cevap
Intel'in open-source ThreadBuildingBlocks, .NET'in Interlocked sınıfı ile aynı işlevselliği sunan bir şablona sahiptir, Atomic.
gcc'nin Atomic yerleşiklerinden farklı olarak, çapraz platformdur ve belirli bir derleyiciye bağlı değildir. Nemanja Trifuno'nun doğru bir şekilde işaret ettiği gibi, x86 ve Itanium yongaları tarafından sağlanan compare-and-swap CPU talimatına bağlı. Intel kitaplığından başka bir şey beklemezsiniz:)
Linux, Win32 gibi atomik "kilitli" işlevleri sunamaz; çünkü bu işlevler donanım desteği gerektirir ve Linux bazı platformlarda çalışır. Bu desteği sunmayın. Kendinizi Intel x86/x64 ile sınırlandırabiliyorsanız, Boost paylaşılan işaretçi kitaplığında referans sayımının uygulanmasına göz atın.
Linux ile ilgisi olmayan sorunu netleştirmek için sadece birkaç not.
RWM (okuması değiştirme-yazma) işlemleri ve tek bir adımda yürütmek anlardır atomik çalıştırmak için donanım desteği; aralarında artışlar ve azalmalar, fetch_and_add, vb.
Bazı mimariler için (I386, AMD_64 ve IA64 dahil) gcc, atomik bellek erişimi için yerleşik bir desteğe sahiptir, bu nedenle harici bir libray gerekmez. Here API hakkında bazı bilgileri okuyabilirsiniz.
Apache Portable Runtime'ın atomic işlevleri, gerçekten Win32 InterlockedXXX işlevlerine çok yakındır.
Doğrudan x68 ile kilitlenmiş talimatları kullanmak için kaynağınıza bazı montaj kodu ekleyebilirsiniz.
lock xadd işlemini kullanmalısınız.
Örneğin bkz. this.
GTK ve QT programlarında kullanılan ve bağımsız olarak kullanılan oldukça yaygın bir glib kitaplığı, bağımsız atom işlemlerini sunar. Bir liste için bkz. http://library.gnome.org/devel/glib/2.16/glib-Atomic-Operations.html. Interlocked'in Win32 üzerinde desteklediği işlemlerin çoğu için g_atomic
işlevleri vardır ve donanımın bunları doğrudan desteklediği platformlarda, gerekli derleme kodu olarak belirtilir.
Lütfen sadece bağlantıyı yazmayın. Anahtar bilgiler cevapta olmalıdır. Her şekilde bir bağlantı ile ek. –