9 經典程序同步問題

2022-03-13 03:03:46 字數 3606 閱讀 9809

生產者消費者問題

讀者-寫者問題

哲學家進餐問題

哲學家就餐問題討論

為防止死鎖發生可採取的措施

每個哲學家拿起第一根筷子一定時間後,若拿不到第二根筷子,再放下第一根筷子

linux下的消費生產商品**:

1 #include 2 #include 3 #include 4 #include 5

6 #include 7 #include 8 #include 9 #include

1011

#define err_exit(m) \

12do\13

while(0)17

18#define consumers_count 2 //

消費者人數

19#define producers_count 2 //

生產者人數

20#define buffsize 5

2122

int g_buffer[buffsize];//

緩衝區數目

2324 unsigned short

in = 0; //

放入產品的指標(生產到哪個緩衝區)

25 unsigned short

out = 0;//

取出緩衝區指標(在哪個緩衝區消費的)

26 unsigned short produce_id = 0

;27 unsigned short consume_id = 0;28

29 sem_t g_sem_full; //

緩衝區可以生產的產品數 = buffsize

30 sem_t g_sem_empty; //

緩衝區可以消費的產品數 = 0

31 pthread_mutex_t g_mutex;//

互斥訊號量

3233 pthread_t g_thread[consumers_count +producers_count];

3435

void *consume(void *arg)

3658

59//

produce()操作(生產產品)

60 consume_id = g_buffer[out

];61 printf("

%d 開始生產 產品 %d\n

",num,consume_id);

62 g_buffer[out] = -1;63

//將取出快取區的指標偏移1(下個生產的位置)

64out = (out+1) %buffsize;

65 printf("

%d 生產商品 %d 結束

",num,consume_id);

66 pthread_mutex_unlock(&g_mutex);

67 sem_post(&g_sem_full);//

signal()操作

68 sleep(1

);69}70

return

null;

7172}73

74void *produce(void *arg)

7592

else

93 printf("%d"

,g_buffer[i]);

9495

if(i==in

)96 printf("

\t------生產");

9798 printf("\n"

);99

}100

101 printf("

%d 開始生產產品 %d\n

",num,produce_id);

102 g_buffer[in] =produce_id;

103in = (in+1)%buffsize;

104 printf("

%d 產品結束生產 %d\n

",num,produce_id++);

105 pthread_mutex_unlock(&g_mutex);

106 sem_post(&g_sem_empty);

107 sleep(5

);108

}109

return

null;

110}

111112

intmain()

113

view code

linux下哲學家進餐**

1 #include 2 #include 3 #include 456

#define n 5

7#define left (i+n-1)%n

8#define right (i+1)%n

9#define think_time 3

10#define eat_time 2

1112

enum

state[n];

1314 pthread_mutex_t mutex =pthread_mutex_initializer, s[n];

1516

//如果能吃法就吃飯

17void test(int

i)1826}

2728

//第i個哲學家餓了

29void take_forks(int

i)30

3738

//第i個哲學家思考

39void put_forks(int

i)40

4748

void think(int

i)49

5354

void eat(int

i)55

5960

//執行緒函式

61void* phi(void*vargp)

6271

return

null;72}

7374

intmain()

75

view code

注意編譯時候後面要加上 -lpthread

經典程序同步問題

文章出處 http heikediguo2005.blog.163.com blog static 2211971200910254235533 依據訊號量與程序的關係,我們可把程序中使訊號量分成私用訊號量和公用訊號量。私有訊號量是指只與制約程序和被制約程序有關的訊號量 公用訊號量是指與一組併發程序...

經典程序同步問題

wait表示為訊號量減一,當訊號量不夠減時 訊號量 0 時 說明當前資源不足,發出資源請求的程序阻塞直到資源可達。signal 表示為訊號量加一,表示釋放了當前訊號量所指代的資源。兩者都是原子操作,不可打斷。生產者不停的向訊息佇列中生產訊息,消費者則不停的從訊息佇列中獲取訊息。當訊息佇列滿時,生產者...

經典程序同步問題

生產者消費者問題 是同步互斥的綜合。乙個生產者程序和乙個消費者程序共享乙個初始為空 大小為n的緩衝區。緩衝區沒滿生產者才能放東西,緩衝區不空消費者才能取東西。設定三個訊號量,mutex表示對緩衝區的互斥訪問,初值為1。empty表示還沒有被訊息佔據的緩衝區大小,初值為n。full表示已經被訊息佔據的...