2013-01-03 83 views
1

是否有任何方式所以我可以有多達10個線程在相同的mutex用互斥體重建sem_wait()?

類似於sem_wait()的值爲10

編輯:

發現這一點:

它是信號量的實現,使用互斥體和條件變量。

typedef struct { 
    int value, wakeups; 
    Mutex *mutex; 
    Cond *cond; 
} Semaphore; 

// SEMAPHORE 

Semaphore *make_semaphore (int value) 
{ 
    Semaphore *semaphore = check_malloc (sizeof(Semaphore)); 
    semaphore->value = value; 
    semaphore->wakeups = 0; 
    semaphore->mutex = make_mutex(); 
    semaphore->cond = make_cond(); 
    return semaphore; 
} 

void sem_wait (Semaphore *semaphore) 
{ 
    mutex_lock (semaphore->mutex); 
    semaphore->value--; 

    if (semaphore->value < 0) { 
    do { 
     cond_wait (semaphore->cond, semaphore->mutex); 
    } while (semaphore->wakeups < 1); 
    semaphore->wakeups--; 
    } 
    mutex_unlock (semaphore->mutex); 
} 

void sem_signal (Semaphore *semaphore) 
{ 
    mutex_lock (semaphore->mutex); 
    semaphore->value++; 

    if (semaphore->value <= 0) { 
    semaphore->wakeups++; 
    cond_signal (semaphore->cond); 
    } 
    mutex_unlock (semaphore->mutex); 
} 
+0

一個互斥體被設計爲允許只有一個消費者(線程,進程,等等)到「有」了。因此,互斥量是一個信號量的特殊情況(準確地說是一個二進制信號量)。僅使用互斥鎖很難實現計數信號量。 – 2013-01-03 12:11:31

+0

我認爲這可以通過互斥和條件變量來完成,但我有點失落..:S –

+0

看看這是否有助於你http://stackoverflow.com/questions/3491762/incrementing-the-value-of-posix-信號量大於1 – banuj

回答

0

沒有,互斥體是一個簡單的鎖,有兩種狀態:鎖定和解鎖。當它被創建時,一個互斥鎖被解鎖。 互斥鎖是互斥鎖。只有一個線程可以保持鎖定。

雖然可以實現,以等待10個線程使用mutexifglobal variable一節進入。 (順便計數信號量實現)

這裏閱讀:Implementing a Counting Semaphore
一個可用的實現:C codeMake your own semaphore

+0

「信號量就像一個互斥量和一個條件變量的組合。」 http://cboard.cprogramming.com/c-programming/102796-pthread_cond_wait-vs-sem_wait.html –

+0

@BillSkiadas是的,我不否認。但'mutex'不允許[**多個線程鎖定。**](http://pic.dhe.ibm.com/infocenter/aix/v7r1/index.jsp?topic=%2Fcom.ibm.aix .genprogc%2Fdoc%2Fgenprogc%2Fmutexes.htm) –

+0

@hGrijesh肖漢我要說的是,它可以用互斥和條件變量來實現.. –

2

看看是否有幫助

從書Begining的Linux編程計數信號量 需要更大範圍的值。通常,信號量用於保護一段代碼,以便在任何時候只有一個執行線程可以運行 。對於這項工作,需要一個二進制信號量。 有時候,你想允許有限數量的線程去執行一個給定的代碼片段 ;這個你可以使用一個計數 信號

+0

有什麼辦法可以通過互斥鎖和條件變量來實現它嗎? –