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

  • echifitness

    echifitness

    9 Kasım 2008
  • MW Technology

    MW Technolog

    28 EKİM 2009
  • The Onion

    The Onion

    14 Mart 2006