Şu anda, C++ 11'de std::thread
kullanarak çok iş parçacıklı bir proje gerçekleştiriyorum. Konuları senkronize etmek için std::condition_variable
kullanıyorum. Ayrıntılı olarak, bir tüketici işlevi, bir genel görev sırasındaki görevi beklemek üzere std::condition_variable
'un wait()
üye işlevini çağırır; başka bir üretici işlevi, görevler oluşturup sıraya koyar. Ama ben ve notify_one()
üye std::condition_variable
üye işlevleri arasındaki farkı bilmiyorum. Üretici işlevinde hangi işlevi kullanmalıyım? Teşekkürler!std :: condition_variable notify_all() ve notify_one() arasındaki fark nedir?
26
A
cevap
22
Koşul değişkeninde on adet iş parçacığı engelleniyorsa, örneğin notify_one()
yalnızca bir iş parçacığı engelini kaldıracaktır, notify_all()
ise bunların tümünü engelini kaldıracaktır. Sizin durumunuzda, notify_one()
'u kullanmak isteyeceksiniz, böylece onları bekleyen herhangi bir işi olmayan konuları uyandırmıyorsunuz.
Teşekkürler, GMan. İnternetten bazı belgeleri okurum. Aynen söylediğin gibi. Bununla birlikte, tipik olarak, wait() işlevi bir mutekste, ör. std :: unique_lock ul (m_mutexTask); (m_lTask.empty()) {m_condTask.wait (ul); } Sonra bile notify_all() tüm konuları uyandırmak, sadece bir iş parçacığı kilitleyebilir, değil mi? –
Sadece bir iş parçacığı mutex'i bir seferde kilitler, ancak hepsi muteks'i alır almaz "bekle" dan dönerler. –
@Yun: Hangisinin kullanılacağı, bekleyen iş parçacıklarından herhangi birinin beklemedeki şeyle başa çıkıp çıkamayacağına bağlıdır. Varsa (örneğin, bir sıradaki birden fazla aynı okuyucu), o zaman kesinlikle daha verimli olduğu için notify_one kullanın. Eğer sadece bir bekletme iş parçacığının döngü koşullarıyla gerçekten başarılı olacağı gibi daha karmaşık bir durum varsa, onları uyandırmak zorunda değilsiniz, çünkü notify_one tarafından hangi iş parçacığının uyandığını kontrol edemezsiniz. –