2012-01-26 10 views
26

Ş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?

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.

+1

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? –

+6

Sadece bir iş parçacığı mutex'i bir seferde kilitler, ancak hepsi muteks'i alır almaz "bekle" dan dönerler. –

+13

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