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循環。
爲什麼信號量沒有設置值,特別是使用sem_open命名的值? – mobone 2014-10-12 02:20:12
您在創建時設置了該值。在任何其他時間設置值都是競爭條件,而不是有用的操作。 – 2014-10-12 02:20:54
但是,如果程序崩潰,sem_open不會重新初始化該值,那麼該程序就會出現故障。我只是做了一個函數,在啓動進程之前將sem值轉換爲正確的初始狀態。 – mobone 2014-10-12 02:25:53