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

  • Dom Esposito

    Dom Esposito

    26 Mayıs 2011
  • merumputdotcom

    merumputdotc

    24 ŞUBAT 2012
  • Mindy

    Mindy

    20 NİSAN 2006