2014-04-04 77 views
0

下面是代碼需要的競爭條件的援助

#define MAX PROCESSES 255 
int number_of_processes = 0; 

/* the implementation of fork() calls this function */ 

int allocate process() 
{ 
    int new pid; 
    if (number_of_processes == MAX PROCESSES) 
     return -1; 
    else { 
    /* allocate necessary process resources */ 
     ++number_of_processes; 
     return new pid; 
    } 
} 

/* the implementation of exit() calls this function */ 
void release process() 
{ 
    /* release process resources */ 
    --number_of_processes; 
} 

我知道比賽的條件是number_of_processes的一個例子。我想了解競賽狀況。我的問題是,如果我有一個帶有acquire()和release()操作的互斥鎖,我可以在哪裏放置鎖以避免競爭條件。我剛開始閱讀關於進程同步和它非常有趣的內容。也可以使用原子整數,例如atomic_t number_of_processes而不是int number_of_processes。我知道原子整數是用來避免上下文切換,但我不確定,但它可能嗎?

回答

0

考慮更改代碼以這種方式,爲互斥鎖:

#define MAX PROCESSES 255 
int number_of_processes = 0; 

/* the implementation of fork() calls this function */ 

int allocate_process() 
{ 
    try { 
     lock.acquire(); 
     int new pid; 
     if (number_of_processes == MAX PROCESSES) 
      return -1; 
     else { 
      /* allocate necessary process resources */ 
      ++number_of_processes; 
      return new pid; 
     } 
    } finally { 
     lock.release(); 
    } 
} 

/* the implementation of exit() calls this function */ 
void release_process() 
{ 
    try { 
     lock.acquire(); 
     /* release process resources */ 
     --number_of_processes; 
    } finally { 
     lock.release(); 
    } 
} 

我用的try /終於從Java語法,它可能是對C略有不同++。

Regadring原子整數 - 簡單與atomic_t取代的int也無濟於事,因爲有與number_of_processes兩個操作中allocate_process,因而整個操作是不是原子。

+0

不客氣。如果您認爲滿意,請記得接受答案。 –