SORU
25 Ocak 2011, Salı


C 0 x hayır semafor var? Nasıl iş parçacıklarını eşitleme?

Merhaba,

C 0 x semafor olmadan gelecek doğru mu? Zaten stackoverflow bazı sorular semafor kullanımı ile ilgili. Onları (posıx semafor) her zaman bir iş parçacığı başka bir iş parçacığı bazı olay bekleyelim kullanıyorum:

void thread0(...)
{
  doSomething0();

  event1.wait();

  ...
}

void thread1(...)
{
  doSomething1();

  event1.post();

  ...
}

Bir dışlama ile yaparım, eğer:

void thread0(...)
{
  doSomething0();

  event1.lock(); event1.unlock();

  ...
}

void thread1(...)
{
  event1.lock();

  doSomethingth1();

  event1.unlock();

  ...
}

Sorun: Bu çirkin ve değil Garanti Bu thread1 kilitler, zaman uyumu ilk (Verilen aynı takılacaktır kilitlemek ve kilidini açmak için bir dışlama, sen de mi kilit event1 önce thread0 ve thread1 başladı).

Bu yüzden destek semafor yok bu yana, yukarıda elde etmek için en kolay yolu nedir?

CEVAP
25 Ocak 2011, Salı


Kolayca bir dışlama ve durum değişken oluşturabilirsiniz:

#include <boost/thread/condition.hpp>
#include <boost/thread/mutex.hpp>

class semaphore
{
private:
    boost::mutex mutex_;
    boost::condition_variable condition_;
    unsigned long count_;

public:
    semaphore()
        : count_()
    {}

    void notify()
    {
        boost::mutex::scoped_lock lock(mutex_);
          count_;
        condition_.notify_one();
    }

    void wait()
    {
        boost::mutex::scoped_lock lock(mutex_);
        while(!count_)
            condition_.wait(lock);
        --count_;
    }
};

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • KarnasCamillo

    KarnasCamill

    24 EKİM 2007
  • KRQE

    KRQE

    6 AĞUSTOS 2007
  • Photoshop Pro Help

    Photoshop Pr

    1 Ocak 2007