2011-03-19 16 views
5

Bir süre önce, çeşitli senkronizasyon ilkelerini birbirleriyle nasıl uygulayacağımı düşünüyordum. Örneğin, pthreads'da muteks ve koşul değişkenleri alırsınız ve bunlardan semaphores oluşturabilirsiniz. Windows API olarak Semaphores kullanarak koşul değişkenini nasıl uygulayabilirsiniz?

(ya da en azından, Windows API eski sürümleri) muteksler ve semaforlar, ancak hiçbir koşul değişken vardır. Muteks ve semaforlar dışında durum değişkenleri inşa etmenin mümkün olabileceğini düşünüyorum, ama benim için yaşamak için bir yol düşünemiyorum.

Herkes bunu için iyi bir yapı biliyor mu?

cevap

0

X verilen semaforları uygulamanın bir yolu, sisteme bir sunucu işlemi eklemektir, onunla iletişim kurmak için semaforları kullanır ve işlemin X'i uygulamak için tüm zor işi yapmasını sağlar. Akademik bir alıştırma olarak, bu hile olabilir Ancak, işin yapılmasını sağlar ve müşteri süreçlerinin yanlış anlamaları veya ani ölümleri için daha güçlü olabilir.

+0

Umm, "semaphore", Windows API'lerinde tamamen farklı bir şey ifade etmedikçe, iletişim kurduğunuz bir şey değildir. – Theo

+0

Bir işlem bir semafor oluşturabilir ve başka bir süreç ayarlanmış olup olmadığını görmek için bunu test edebilir. İki makine, voltajları birkaç kablo altında test ederek ve ayarlayarak keyfi mesajları iletebilir. İki süreç, semaforların durumunu test ederek ve ayarlayarak keyfi mesajları iletebilir. Pratikte muhtemelen semaforları yalnızca paylaşılan belleğe erişimi düzenlemek için kullanacaksınız, fakat her iki durumu da iletişim olarak görüyorum - ikinci durumda iletişim kuruyor olsanız bile "Tamam - şimdi paylaşılan belleği okuyabilirsiniz". – mcdowella

1

burada bir şey eksik, ama yazıda anlatılan şekilde daha Semaphore ve Lock'tan bir Koşulu uygulamak için daha basit bir yolu var gibi görünüyor olabilir.

class Condition { 
    sem_t m_sem; 
    int m_waiters; 
    int m_signals; 
    pthread_mutex_t *m_mutex; 
public: 

    Condition(pthread_mutex_t *_mutex){ 
     sem_init(&this->m_sem,0,0); 
     this->m_waiters = 0; 
     this->m_signals = 0; 
     this->m_mutex = _mutex; 
    } 
    ~Condition(){} 
    void wait(); 
    void signal(); 
    void broadcast(); 
}; 

void Condition::wait() { 
    this->m_waiters++; 
    pthread_mutex_unlock(this->m_mutex); 
    sem_wait(&this->m_sem); 
    pthread_mutex_lock(this->m_mutex); 
    this->m_waiters--; 
    this->m_signals--; 
} 

void Condition::signal() { 
    pthread_mutex_lock(this->m_mutex); 
    if (this->m_waiters && (this->m_waiters > this->m_signals)) { 
     sem_post(&this->m_sem); 
     this->m_signals++; 
    } 
    pthread_mutex_unlock(this->m_mutex); 
} 
+1

Bunu çoğunlukla çalışması gerektiğini düşünüyorum ama teorik, son garson sem_wait'in arasındaki sinyal arayarak bir yolla bir pthread_mutex_lock preempted alabilir - ve bu altüst semafor değeri olur. Bu şeyleri mümkün olan tüm iş parçacıkları için doğru bulmak zor. – PSkocik

İlgili konular