程序間同步互斥經典問題 一 生產者 消費者問題

2021-08-15 21:58:48 字數 2933 閱讀 1753

生產者-消費者問題,也叫做快取繫結問題(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 ...