2014-10-12 23 views
0

我真的很困惑,爲什麼這不起作用,並且因爲大多數關於信號量的例子是多線程的,而不是多處理的,所以我很難過。我的代碼不工作,除非我把這個上面的sem_wait。沒有sem_getvalue的信號量不工作?

while (1) 
    { 
     int x; 
     sem_getvalue(sem1, &x); 
     if (x>0) break; 
     sleep(1); 
    } 

本質上做一個信號量我自己...這就像sem_wait只檢查一次的價值,然後永遠坐着。我有兩個生產者和一個消費者。這是它的結構:

Producer 1: 
    sem_waits for sem1 (initially set to 1) 
    sem_posts to sem2 
Producer 2: 
    sem_waits for sem2 (initially set to 0) 
    sem_posts to sem1 

沒有片段生產者2永遠不會運行。在生產者2但不是1的片段中,生產者1運行,然後運行2,然後停止。都需要該代碼段做他們的所有其他的事情..

我覺得我的問題是在這裏:

// sem open must be used to be used by multiple processes? 
sem_t *sem1 = sem_open("producer", O_CREAT, 0644, 1); 
sem_t *sem2 = sem_open("producer2", O_CREAT, 0644, 0); 
sem_t *consumer_full = sem_open("cfull", O_CREAT, 0644, 0); 
sem_t *consumer_empty = sem_open("cempty", O_CREAT, 0644, 0); 

// sem_open remains in memory even after program exit. 
// initialize to correct value to be sure 

sem_init(sem1,0,1); 
sem_init(sem2,0,0); 
sem_init(consumer_full,0,0); 
sem_init(consumer_empty,0,0); 

的sem_init改變信號燈,使他們只能通過在共享存儲器中存儲共享?但是,我怎樣才能初始化一個sem_open信號量而無需設計一些任意的while while循環。

回答

0

sem_init用於創建匿名信號量。在通過sem_open打開的已命名信號調用它會調用未定義的行爲。這可能是你的問題的根源。你正在使用新的匿名非進程共享信號量來打開命名的進程共享信號量,即使它沒有調用未定義的行爲,這在語義上也是錯誤的。

+0

爲什麼信號量沒有設置值,特別是使用sem_open命名的值? – mobone 2014-10-12 02:20:12

+0

您在創建時設置了該值。在任何其他時間設置值都是競爭條件,而不是有用的操作。 – 2014-10-12 02:20:54

+0

但是,如果程序崩潰,sem_open不會重新初始化該值,那麼該程序就會出現故障。我只是做了一個函數,在啓動進程之前將sem值轉換爲正確的初始狀態。 – mobone 2014-10-12 02:25:53