Windows ortamında, WinAPI'nin kritik bölümlerini veya başka bir şeyi kullanarak Boost'un kapsamlı mutex'i mi var?Boost's scoped mutex ve WinAPi'nin kritik bölümü arasında bir fark var mı?
cevap
Geçerli sürüm boost::mutex
ne Win32 CRITICAL_SECTION
ne de bir Win32 Mutex kullanır. Bunun yerine, atomik işlemleri ve beklemeleri engellemek için bir Win32 Olayı kullanır.
Eski sürümler (1.34.1 ve önceki sürümleri), Windows'ta CRITICAL_SECTION
civarında bir paketleyiciydi.
Bu arada, muteksin kendisi kapsam dışı değildir. boost::mutex::scoped_lock
türünde ve son sürümlerde, boost::lock_guard<boost::mutex>
ve boost::unique_lock<boost::mutex>
RAII paketleyicileri, kilidini açmayı unutmadığınızdan emin olmak için bir muteks kilitleme sağlar.
boost::lock_guard<>
ve boost::unique_lock<>
şablonları lock()
ve unlock()
üye fonksiyonları ile herhangi bir tür ile çalışmak, böylece istenirse şu işlemler arası muteksler ile kullanabilirsiniz.
Cevabınız için teşekkür ederiz. – nhaa123
Bu muhtemelen bir Win32 Kritik Bölümü kadar verimli/neredeyse kadar mı? – unixman83
@ unixman83: Şüpheliyim, kritik bir bölüm hızlıdır çünkü süreç içi olduğu için süreçler arasında kullanamazsınız. Bu bir çekirdek nesnesi değil, ancak Win32 Olayları. Bu yüzden bir CS kadar hızlı olmadığını varsayabilirim. – gbjbaanb
Win32'un CRITICAL_SECTION öğesi yalnızca tek bir işlemin tek bir işleminde kullanılabilir. İşlemler arasında bir şey kullanmanız gerekiyorsa, bir muteks'e ihtiyacınız var. Boost kritik bölümler hakkında hiçbir şey söylemiyor, bu yüzden muteksleri kullandığını farz ediyorum.
"Kapsamlı", yalnızca belirli bir kapsamın sonunda muteksin otomatik olarak açılması için RAII kullanan bir sarıcıya sahip olduğu anlamına gelir.
Boost kaynak kodunu incelemediniz, değil mi? :) – OregonGhost
Erişim hakkına sahip olmadığım bir yerdeyim :( – nhaa123
Hem Stack Overflow hem de Boost kaynaklarının İnternet erişimine sahip olmanız gerekiyor http://svn.boost.org/svn/boost/trunk/ – ognian