問題提出:
??????? 在并發訪問的時候,允許并發訪問函數A,但是當訪問函數A時不允許訪問函數B,同樣訪問函數B時不能函數A,即兩個函數之間是互斥的.如何才能獲得訪問A時的最大性能呢?
解決方案(1):
???????假設多進程環境下,一般選用PID作為可重入的重要條件,傳統實現如下:
?????? void lockpid(lock* p)
????? {
???????????? if(p->pid == getpid())
?????????????????? return;
???????????? else
??????????? {
??????????????????p->lock();
????????????}
????? }
??????本題解決也是借鑒如此,使用整數 lockv = 0;作為兩函數互斥的根本,當lockv>0時表示正在訪問函數A,<0時表示正在訪問函數B.具體實現如下:
??????函數A()
??????{
??????????? //臨界區
???????????{
??????????????????while(lockv < 0)
????????????????????????usleep(1);
??????????????????++lockv;
??????????? }
????????????
??????????? //do something ...
?????????? //臨界區
???????????{
??????????????????--lockv;
??????????? }???????
?????? }
???????
??????函數B()
??????{
??????????? //臨界區
???????????{
??????????????????while(lockv?> 0)
????????????????????????usleep(1);
??????????????????--lockv;
??????????? }
????????????
??????????? //do something ...
?????????? //臨界區
???????????{
??????????????????++lockv;
??????????? }???????
?????? }
??????缺點很明顯的,雖然在臨界區里面只有幾個機器指令,但并不能獲得最大的性能.如何優化才能獲得函數A的最大性能呢?
posted on 2006-11-18 11:44
merlinfang 閱讀(341)
評論(0) 編輯 收藏 引用