生產者-消費者問題,也叫做快取繫結問題(bounded-buffer),是乙個多程序同步問題。
要避免多個生產商競爭乙個空位的情況。要避免生產商和消費者同時睡覺,造成死鎖
要避免多個消費者競爭同一段資料的情況
首先考慮生產商,在多個生產商和多個消費者同時執行的情況下:
2.每乙個生產商在執行操作前申請互斥鎖
3.生產乙個新的商品放入空位,並且釋放互斥鎖,v(full)
然後考慮消費者,在多個消費者和多個生產商同時存在的情況下:
2.在執行操作前申請互斥鎖
3.消費乙個商品,並且釋放互斥鎖,v(empty)
#include
#include
#include
#include
#include
#include
#include
#include
#include "ipc.h"
int main ( int argc , char * argv )
if (( empty = semget( (key_t) key_empty , 1 , 0666|ipc_creat)) == -1 )
if (( full = semget((key_t) key_full , 1 , 0666|ipc_creat)) == -1 )
if ((shmid = shmget ((key_t)key_shm,sizeof (struct shared_use_st),0666|ipc_creat))==-1)
sem_union.val = 1;
if ( semctl(mutex,0,setval,sem_union) == -1 )
sem_union.val = 0;
if ( semctl(full,0,setval,sem_union) == -1 )
sem_union.val = buffer_size;
if ( semctl(empty, 0 , setval , sem_union) == -1 )
/*void* shmat ( int shmid , const void* shmaddr , int shm*** )
鏈結共享記憶體識別符號為shmid的共享記憶體,鏈結成功後把共享記憶體區物件
對映到呼叫程序的位址空間,隨後可像本地空間一樣訪問。
shmid 共享記憶體識別符號
shmaddr 指定共享記憶體出現在程序記憶體位址的什麼位置,直接指定為null讓核心自己決定
乙個合適的位址位置.
shm_rdonly 為唯讀模式,其他為讀寫模式
*/if (( shared_memory = shmat( shmid ,(void*)0 , 0)) == (void*)-1 )
shared_stuff = ( struct shared_use_st * ) shared_memory;
for ( i = 0; i < buffer_size ; i ++ )
shared_stuff->low = 0;
shared_stuff->high = 0;
shared_stuff->cur = 0;
exit(exit_success);
} /*
int shmdt ( const void* shmaddr )
成功返回0,除錯返回-1
*/
#include "ipc.h"
int main ( int argc , char * argv )
if ((empty = semget((key_t)key_empty,1,0666|ipc_creat)) == -1 )
if ((full = semget((key_t)key_full,1,0666|ipc_creat)) == -1 )
if ((shmid=shmget((key_t)key_shm,sizeof(struct shared_use_st),0666|ipc_creat)) == -1 )
if ((shared_memory = shmat(shmid,(void*)0,0)) == (void*)-1)
shared_stuff = ( struct shared_use_st * ) shared_memory;
for ( i = 0 ; i < 30 ; i++ )
if ( shmdt(shared_memory) == -1 )
printf ( "finish!\n" );
getchar();
exit(exit_success);
}
#include "ipc.h"
int main ( int argc , char* argv )
if ((empty=semget((key_t)key_empty,1,0666|ipc_creat)) == -1 )
if ((full=semget((key_t)key_full,1,0666|ipc_creat)) == -1 )
if ((shared_memory = shmat(shmid,(void*)0,0) ) ==(void*)-1 )
shared_stuff = (struct shared_use_st*)shared_memory;
for(i=0;i<30;i++)
if ( shmdt(shared_memory) == -1 )
printf ( "finish!\n" );
getchar();
exit(exit_success);
}
經典同步問題一 生產者和消費者問題
系列同步問題 經典同步問題一 生產者和消費者問題 經典同步問題二 哲學家進餐問題 經典同步問題三 讀者寫者問題 不懂得結構型訊號量的小夥伴可參考下面博文,之後再閱讀本博文,更易於理解 乙個或多個生產者產生資料並放在緩衝區中,每次乙個。乙個或多個消費者從緩衝區取資料項並消費,每次乙個。條件 1 在任意...
經典程序同步與互斥問題 生產者消費者問題
問題描述 生產者 消費者問題是指有兩組程序共享乙個環形的緩衝池,一組稱為生產者,一組稱為消費者。緩衝池是由若干個大小相等的緩衝區組成,每個緩衝區可以容納乙個產品。生產者程序不斷的將產品放入緩衝池中,消費者不斷將產品從緩衝池中取出。核心 生產者 消費者問題,既存在著程序同步問題,也存在著臨界區互斥問題...
OS 訊號量(一) 生產者消費者問題
自己作業系統學的不咋樣,這學期剛學完也就趁熱打鐵鞏固一下吧 話說考完就沒再碰過,欸 以此為契機拿這個演算法練練手順便加深印象,其他經典同步互斥演算法之後會慢慢更。首先是生產者消費者問題,自己碼的python3 難免會有錯誤,歡迎指正。如下 coding utf 8 import threading ...