生產者消費者問題
讀者-寫者問題
哲學家進餐問題
哲學家就餐問題討論
為防止死鎖發生可採取的措施
每個哲學家拿起第一根筷子一定時間後,若拿不到第二根筷子,再放下第一根筷子
linux下的消費生產商品**:
1 #include 2 #include 3 #include 4 #include 5view code6 #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
linux下哲學家進餐**
1 #include 2 #include 3 #include 456view code#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
注意編譯時候後面要加上 -lpthread
經典程序同步問題
文章出處 http heikediguo2005.blog.163.com blog static 2211971200910254235533 依據訊號量與程序的關係,我們可把程序中使訊號量分成私用訊號量和公用訊號量。私有訊號量是指只與制約程序和被制約程序有關的訊號量 公用訊號量是指與一組併發程序...
經典程序同步問題
wait表示為訊號量減一,當訊號量不夠減時 訊號量 0 時 說明當前資源不足,發出資源請求的程序阻塞直到資源可達。signal 表示為訊號量加一,表示釋放了當前訊號量所指代的資源。兩者都是原子操作,不可打斷。生產者不停的向訊息佇列中生產訊息,消費者則不停的從訊息佇列中獲取訊息。當訊息佇列滿時,生產者...
經典程序同步問題
生產者消費者問題 是同步互斥的綜合。乙個生產者程序和乙個消費者程序共享乙個初始為空 大小為n的緩衝區。緩衝區沒滿生產者才能放東西,緩衝區不空消費者才能取東西。設定三個訊號量,mutex表示對緩衝區的互斥訪問,初值為1。empty表示還沒有被訊息佔據的緩衝區大小,初值為n。full表示已經被訊息佔據的...