Linux??????????????????????
?????Linux ???????[ 2014/10/21 10:53:36 ] ????????Linux ?????? ???
??????????????????????????????????????????
1 //????????????
2 void InitQue(PT_QUEUE ptQue)
3 {
4 memset(ptQue?? 0?? sizeof(*ptQue));
5 }
6
7 //??????????胁??????
8 void EnterQue(PT_QUEUE ptQue?? int dwElem)
9 {
10 if(IsQueFull(ptQue))
11 {
12 printf("Elem %d cannot enter Queue %p(Full)! "?? dwElem?? ptQue);
13 return;
14 }
15 ptQue->aData[ptQue->dwTail]= dwElem;
16 ptQue->dwTail = (ptQue->dwTail + 1) % QUEUE_SIZE;
17 }
18
19 //?????????????????
20 int LeaveQue(PT_QUEUE ptQue)
21 {
22 if(IsQueEmpty(ptQue))
23 {
24 printf("Queue %p is Empty! "?? ptQue);
25 return -1;
26 }
27 int dwElem = ptQue->aData[ptQue->dwHead];
28 ptQue->dwHead = (ptQue->dwHead + 1) % QUEUE_SIZE;
29 return dwElem;
30 }
31
32 //?????????尾???????????????
33 void DisplayQue(PT_QUEUE ptQue)
34 {
35 if(IsQueEmpty(ptQue))
36 {
37 printf("Queue %p is Empty! "?? ptQue);
38 return;
39 }
40
41 printf("Queue Element: ");
42 int dwIdx = ptQue->dwHead;
43 while((dwIdx % QUEUE_SIZE) != ptQue->dwTail)
44 printf("%d "?? ptQue->aData[(dwIdx++) % QUEUE_SIZE]);
45
46 printf(" ");
47 }
??????????锌??????????????????????
1 //?卸??????????????
2 int IsQueEmpty(PT_QUEUE ptQue)
3 {
4 return ptQue->dwHead == ptQue->dwTail;
5 }
6
7 //?卸??????????????
8 int IsQueFull(PT_QUEUE ptQue)
9 {
10 return (ptQue->dwTail + 1) % QUEUE_SIZE == ptQue->dwHead;
11 }
12
13 //????????????????
14 int QueDataNum(PT_QUEUE ptQue)
15 {
16 return (ptQue->dwTail - ptQue->dwHead + QUEUE_SIZE) % QUEUE_SIZE;
17 }
18
19 //?????????卸???位??
20 int GetQueHead(PT_QUEUE ptQue)
21 {
22 return ptQue->dwHead;
23 }
24 //?????????卸??????
25 int GetQueHeadData(PT_QUEUE ptQue)
26 {
27 return ptQue->aData[ptQue->dwHead];
28 }
29 //?????????卸?尾位??
30 int GetQueTail(PT_QUEUE ptQue)
31 {
32 return ptQue->dwTail;
33 }
?????????QueueTest()????????????泻???????
1 static T_QUEUE gtQueue;
2 void QueueTest(void)
3 {
4 InitQue(>Queue);
5 printf("Enter Queue 1??2??3??4??5... ");
6 EnterQue(>Queue?? 1);
7 EnterQue(>Queue?? 2);
8 EnterQue(>Queue?? 3);
9 EnterQue(>Queue?? 4);
10 EnterQue(>Queue?? 5);
11 printf("Queue Status: Empty(%d)?? Full(%d) "?? IsQueEmpty(>Queue)?? IsQueFull(>Queue));
12 printf("Queue Elem Num: %u "?? QueDataNum(>Queue));
13 printf("Head: %u(%d) "?? GetQueHead(>Queue)?? GetQueHeadData(>Queue));
14 printf("Tail: %u "?? GetQueTail(>Queue));
15 DisplayQue(>Queue);
16
17 printf(" Leave Queue... ");
18 printf("Leave %d "?? LeaveQue(>Queue));
19 printf("Leave %d "?? LeaveQue(>Queue));
20 printf("Leave %d "?? LeaveQue(>Queue));
21 DisplayQue(>Queue);
22
23 printf(" Enter Queue 6??7... ");
24 EnterQue(>Queue?? 6);
25 EnterQue(>Queue?? 7);
26 DisplayQue(>Queue);
27
28 printf(" Leave Queue... ");
29 printf("Leave %d "?? LeaveQue(>Queue));
30 printf("Leave %d "?? LeaveQue(>Queue));
31 printf("Leave %d "?? LeaveQue(>Queue));
32 DisplayQue(>Queue);
33 }
????????????????薪?????锟�?
1 Enter Queue 1??2??3??4??5...
2 Elem 5 cannot enter Queue 0x8053f9c(Full)!
3 Queue Status: Empty(0)?? Full(1)
4 Queue Elem Num: 4
5 Head: 0(1)
6 Tail: 4
7 Queue Element: 1 2 3 4
8
9 Leave Queue...
10 Leave 1
11 Leave 2
12 Leave 3
13 Queue Element: 4
14
15 Enter Queue 6??7...
16 Queue Element: 4 6 7
17
18 Leave Queue...
19 Leave 4
20 Leave 6
21 Leave 7
22 Queue 0x8053f9c is Empty!
?????????????????????????????
?????? ????????????????
????2.1 ???????
?????????????Linux????????芯??????????/??????(producer-consumer)???????????婕�?????小??????薪缍�????(bounded buffer)?????????????(?????????????)??
??????????????锌??????????????????????(???????)??????????(???????)?????????????????????????????(???????)?????些?????????????????????????????????????IPC?????
????????????涔�?????????????????????????????????????(??娲�?????????)?????????????????娲�????????????????????????????
?????????????????????????????????????
????????????/???????????校???????????????????????锌??????????????蟹????????????????(??????????)??????????????????位?谩??????????????????????????榛�??????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????写???????????????????????????????????????????????????????????????????????
????2.2 ????????
?????????????????????????????????/????????????????????
???????????????????????????卤???????????????????????????????????????
??????????????????????
????1 #define PRODUCER_NUM 5 //????????
????2 #define CONSUMER_NUM 3 //????????
????3 #define PRD_NUM 20 //????????????
????4 #define DELAY_TIME 3 //????(??????)??????????????
????5
????6 #define QUEUE_SIZE (PRD_NUM+1) //???写?????QUEUE_SIZE-1?????
????7
????8 T_QUEUE gtQueue;
????9 pthread_mutex_t gtQueLock = PTHREAD_MUTEX_INITIALIZER;
????10 pthread_cond_t gtPrdCond = PTHREAD_COND_INITIALIZER; //Full->Not Full
????11 pthread_cond_t gtCsmCond = PTHREAD_COND_INITIALIZER; //Empty->Not Empty
?????????QUEUE_SIZE??????????????濉�??????gtQueLock?????????????gtQueue????????????????????????gtPrdCond?????????????????????(????)????????????gtCsmCond????????????????????????????
????????????????????????????????????????????????????????????????gtCsmCond(??????????胁??)??????????????????????????????????????????????????????????????????????????????????????????????????????gtCsmCond??????斜??????????????????????????“????”????????????????????????????????????????????????????????????????????
??????

???路???
??????????????????
2023/3/23 14:23:39???写?貌??????????
2023/3/22 16:17:39????????????????????些??
2022/6/14 16:14:27??????????????????????????
2021/10/18 15:37:44???????????????
2021/9/17 15:19:29???路???????路
2021/9/14 15:42:25?????????????
2021/5/28 17:25:47??????APP??????????
2021/5/8 17:01:11