2011-10-25 25 views
0

我發現了下面的信號量示例。我目前正在學習線程同步。我有幾個問題。 1)如果一個信號量的初始化值爲零,我調用semaphore_down是現在的信號量值-1,或者只是檢查semaphore_down是否大於零,然後阻止?iphone上的等價信號量遞減

2)我是IOS編碼,沒有semaphore_down函數可用。什麼是等值的?它和semaphore_wait一樣嗎?

我想要一個生產者線程永遠運行,等待它不需要產生和喚醒時,它不會阻塞其他線程。

這似乎是我所需要的,但建議是值得歡迎的。

void reader_function(void); 
    void writer_function(void); 
    char buffer; 
    Semaphore writers_turn; 
    Semaphore readers_turn; 
    main() 
    { 
    pthread_t reader; 
    semaphore_init(&readers_turn); 
    semaphore_init(&writers_turn); 
    /* writer must go first */ 
    semaphore_down(&readers_turn); 
    pthread_create(&reader, pthread_attr_default, 
    (void *)&reader_function, NULL); 
    writer_function(); 
    } 
    void writer_function(void) 
    { 
    while(1) 
    { 
    semaphore_down(&writers_turn); 
    buffer = make_new_item(); 
    semaphore_up(&readers_turn); 
    } 
    } 
    void reader_function(void) 
    { 
    while(1) 
    { 
    semaphore_down(&readers_turn); 
    consume_item(buffer); 
    semaphore_up(&writers_turn); 
    } 
    } 

回答

0

如果試圖等待爲0的值的信號,它永遠不會去負 - 它總是會被阻塞,直到另一個線程的帖子信號量遞增它,此時你的線程將被喚醒增加和減少它。

你在使用什麼樣的信號量庫?信號量對象通常只支持兩種操作:等待,以及可選的初始化和去初始化方法。因此,根據名稱,您的semaphore_wait應該semaphore_down相同,但是如果沒有看到您的信號量庫的文檔資料就說不出來。

iOS也有POSIX semaphores,您可以改用它。

+0

那麼這個例子來自一本書的摘錄,並沒有說它是什麼庫。我會嘗試semaphore_wait,看看會發生什麼。在ios上使用posix,信號量不可能小於0? – dubbeat

+0

在任何系統上,信號計數都不可能小於0.如果計數小於0,則它不是信號量。 –