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

  • Google

    Google

    18 EYLÜL 2005
  • jcortes187

    jcortes187

    24 Mart 2006
  • KRQE

    KRQE

    6 AĞUSTOS 2007