成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

軟件開發實踐中的入隊列和出隊列操作的C代碼示例

開發 開發工具
大家都知道,隊列的特點是先入先出,即數據是按照入隊列的順序出隊列的。在實際的軟件開發項目中,當一個中間模塊需要接收和發送大量的消息時,隊列就可以大展身手了。

概述

[[178004]]

最近有在校的學生朋友在問我,數據結構中的隊列在實際的軟件開發項目中有什么樣的用處。

大家都知道,隊列的特點是先入先出,即數據是按照入隊列的順序出隊列的。在實際的軟件開發項目中,當一個中間模塊需要接收和發送大量的消息時,隊列就可以大展身手了。我們可以將接收到的數據存儲在一個全局隊列中,然后在另外的程序流程中將數據從同一個全局隊列中取出來,經過一定的處理之后將消息發送到另外的模塊。這樣做可以降低程序的性能瓶頸。

本文用實際的C代碼示例了簡單的數據入隊列和出隊列的方法,大家可據此了解隊列的實際用法,也可參照來實現更加復雜的隊列操作。

C代碼

  1. /********************************************************************** 
  2. * 版權所有 (C)2016, Zhou Zhaoxiong 
  3. * 文件名稱:QueueUse.c 
  4. * 文件標識:無 
  5. * 內容摘要:示例隊列的使用(入隊和出隊) 
  6. * 其它說明:無 
  7. * 當前版本:V1.0 
  8. * 作    者:Zhou Zhaoxiong 
  9. * 完成日期:20160811 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12. #include <string.h> 
  13. #include <ftw.h> 
  14. #include <pthread.h> 
  15. #include <time.h> 
  16.  
  17.  
  18. // 重定義數據類型 
  19. typedef signed   int        INT32; 
  20. typedef unsigned int        UINT32; 
  21. typedef unsigned char       UINT8; 
  22.  
  23. // 宏定義 
  24. #define     MAX_QUEUE      10000          // ***隊列元素個數 
  25.  
  26. // 結構體變量 
  27. typedef struct 
  28.     UINT32 iID;             // 編號 
  29.     UINT8  szInfo[100];     // 描述 
  30. } T_StructInfo; 
  31.  
  32. // 全局變量定義 
  33. T_StructInfo g_tQueue[MAX_QUEUE] = {0};      // 隊列結構體 
  34. UINT32 g_iQueueHead = 0;                     // 隊列頭部索引 
  35. UINT32 g_iQueueTail = 0;                     // 隊列尾部索引 
  36. pthread_mutex_t     g_mutex_queue_cs;        // 互斥信號量 
  37. pthread_cond_t      queue_cv; 
  38. pthread_mutexattr_t g_MutexAttr; 
  39.  
  40. // 函數聲明 
  41. void PutDataIntoQueue(void); 
  42. void GetDataFromQueue(void); 
  43. INT32 EnQueue(T_StructInfo tQueueData); 
  44. INT32 DeQueue(T_StructInfo *ptStructData); 
  45. void Sleep(UINT32 iCountMs); 
  46.  
  47.  
  48. /**************************************************************** 
  49. * 功能描述: 主函數 
  50. * 輸入參數: 無 
  51. * 輸出參數: 無 
  52. * 返 回 值: 0-執行完成 
  53. * 其他說明: 無 
  54. * 修改日期       版本號        修改人        修改內容 
  55. ------------------------------------------------------------- 
  56. * 20160811        V1.0     Zhou Zhaoxiong     創建 
  57. ****************************************************************/ 
  58. INT32 main(void) 
  59.     pthread_mutex_init(&g_mutex_queue_cs, &g_MutexAttr); 
  60.     pthread_cond_init(&queue_cv, NULL); 
  61.  
  62.  
  63.     // 在循環中執行入隊和出隊操作 
  64.     while (1) 
  65.     { 
  66.         PutDataIntoQueue();  // 數據入隊 
  67.  
  68.  
  69.         Sleep(5 * 1000);     // 間隔5秒 
  70.  
  71.  
  72.         GetDataFromQueue();  // 數據出隊 
  73.  
  74.  
  75.         Sleep(60 * 1000);    // 每一分鐘執行一次出隊和入隊 
  76.     } 
  77.  
  78.  
  79.     return 0; 
  80.  
  81.  
  82.  
  83.  
  84. /**************************************************************** 
  85. * 功能描述: 將數據加入隊列中 
  86. * 輸入參數: 無 
  87. * 輸出參數: 無 
  88. * 返 回 值: 0-成功   -1-失敗 
  89. * 其他說明: 無 
  90. * 修改日期       版本號        修改人        修改內容 
  91. ------------------------------------------------------------- 
  92. * 20160811        V1.0     Zhou Zhaoxiong     創建 
  93. ****************************************************************/ 
  94. void PutDataIntoQueue(void) 
  95.     T_StructInfo tQueueData = {0}; 
  96.     static UINT32 iCountNum = 0; 
  97.  
  98.  
  99.     // 對結構體的變量進行賦值 
  100.     tQueueData.iID = iCountNum; 
  101.     snprintf(tQueueData.szInfo, sizeof(tQueueData.szInfo) - 1, "zhou%d", iCountNum); 
  102.  
  103.  
  104.     // 計數值累加 
  105.     iCountNum ++; 
  106.     if (iCountNum >= MAX_QUEUE-1) 
  107.     { 
  108.         iCountNum = 0; 
  109.     } 
  110.  
  111.  
  112.     // 將數據加入隊列(一直等到加入成功之后才退出) 
  113.     while (EnQueue(tQueueData) == -1) 
  114.     { 
  115.         Sleep(1000);       // 加入失敗,1秒后重試 
  116.     } 
  117.  
  118.  
  119.     // 打印加入的數據 
  120.     printf("PutDataIntoQueue: ID=%d, Info=%s\n", tQueueData.iID, tQueueData.szInfo); 
  121.  
  122.  
  123.  
  124.  
  125. /**************************************************************** 
  126. * 功能描述: 將數據取出隊列中 
  127. * 輸入參數: 無 
  128. * 輸出參數: 無 
  129. * 返 回 值: 0-成功   -1-失敗 
  130. * 其他說明: 無 
  131. * 修改日期       版本號        修改人        修改內容 
  132. ------------------------------------------------------------- 
  133. * 20160811        V1.0     Zhou Zhaoxiong     創建 
  134. ****************************************************************/ 
  135. void GetDataFromQueue(void) 
  136.     T_StructInfo tQueueData = {0}; 
  137.  
  138.  
  139.     if (DeQueue(&tQueueData) == -1) 
  140.     { 
  141.         return
  142.     } 
  143.  
  144.  
  145.     // 打印取出的數據 
  146.     printf("GetDataFromQueue: ID=%d, Info=%s\n", tQueueData.iID, tQueueData.szInfo); 
  147.  
  148.  
  149.  
  150.  
  151. /**************************************************************** 
  152. * 功能描述: 數據入隊列 
  153. * 輸入參數: tQueueData-隊列數據 
  154. * 輸出參數: 無 
  155. * 返 回 值: 0-成功   -1-失敗 
  156. * 其他說明: 無 
  157. * 修改日期       版本號        修改人        修改內容 
  158. ------------------------------------------------------------- 
  159. * 20160811        V1.0     Zhou Zhaoxiong     創建 
  160. ****************************************************************/ 
  161. INT32 EnQueue(T_StructInfo tQueueData) 
  162.     INT32  iRetVal  = 0; 
  163.     UINT32 iNextPos = 0; 
  164.  
  165.  
  166.     pthread_mutex_lock(&g_mutex_queue_cs); 
  167.     iNextPos = g_iQueueTail + 1; 
  168.  
  169.  
  170.     if (iNextPos >= MAX_QUEUE) 
  171.     { 
  172.         iNextPos = 0; 
  173.     } 
  174.  
  175.  
  176.     if (iNextPos == g_iQueueHead) 
  177.     { 
  178.         iRetVal = -1;   // 已達到隊列的***長度 
  179.     } 
  180.     else 
  181.     { 
  182.         // 入隊列 
  183.         memset(&g_tQueue[g_iQueueTail], 0x00,  sizeof(T_StructInfo)); 
  184.         memcpy(&g_tQueue[g_iQueueTail], &tQueueData, sizeof(T_StructInfo)); 
  185.  
  186.  
  187.         g_iQueueTail = iNextPos; 
  188.     } 
  189.  
  190.  
  191.     pthread_cond_signal(&queue_cv); 
  192.     pthread_mutex_unlock(&g_mutex_queue_cs); 
  193.  
  194.  
  195.     return iRetVal; 
  196.  
  197.  
  198.  
  199.  
  200. /**************************************************************** 
  201. * 功能描述: 數據出隊列 
  202. * 輸入參數: ptStructData-隊列數據 
  203. * 輸出參數: 無 
  204. * 返 回 值: 0-成功   -1-失敗 
  205. * 其他說明: 無 
  206. * 修改日期       版本號        修改人        修改內容 
  207. ------------------------------------------------------------- 
  208. * 20160811        V1.0     Zhou Zhaoxiong     創建 
  209. ****************************************************************/ 
  210. INT32 DeQueue(T_StructInfo *ptStructData) 
  211.     T_StructInfo tQueueData = {0}; 
  212.  
  213.  
  214.     if (ptStructData == NULL
  215.     { 
  216.         return -1; 
  217.     } 
  218.  
  219.  
  220.     pthread_mutex_lock(&g_mutex_queue_cs); 
  221.  
  222.  
  223.     while (g_iQueueHead == g_iQueueTail) 
  224.     { 
  225.         pthread_cond_wait(&queue_cv, &g_mutex_queue_cs); 
  226.     } 
  227.  
  228.  
  229.     memset(&tQueueData, 0x00, sizeof(T_StructInfo)); 
  230.     memcpy(&tQueueData, &g_tQueue[g_iQueueHead], sizeof(T_StructInfo)); 
  231.     g_iQueueHead ++; 
  232.  
  233.  
  234.     if (g_iQueueHead >= MAX_QUEUE) 
  235.     { 
  236.         g_iQueueHead = 0; 
  237.     } 
  238.  
  239.  
  240.     pthread_mutex_unlock(&g_mutex_queue_cs); 
  241.     memcpy(ptStructData, &tQueueData, sizeof(T_StructInfo)); 
  242.  
  243.  
  244.     return 0; 
  245.  
  246.  
  247.  
  248.  
  249. /********************************************************************** 
  250. * 功能描述: 程序休眠 
  251. * 輸入參數: iCountMs-休眠時間(單位:ms) 
  252. * 輸出參數: 無 
  253. * 返 回 值: 無 
  254. * 其它說明: 無 
  255. * 修改日期      版本號       修改人        修改內容 
  256. ------------------------------------------------------------------ 
  257. * 20160811       V1.0     Zhou Zhaoxiong     創建 
  258. ********************************************************************/  
  259. void Sleep(UINT32 iCountMs) 
  260.     struct timeval t_timeout = {0}; 
  261.  
  262.  
  263.     if (iCountMs < 1000) 
  264.     { 
  265.         t_timeout.tv_sec  = 0; 
  266.         t_timeout.tv_usec = iCountMs * 1000; 
  267.     } 
  268.     else 
  269.     { 
  270.         t_timeout.tv_sec  = iCountMs / 1000; 
  271.         t_timeout.tv_usec = (iCountMs % 1000) * 1000; 
  272.     } 
  273.     select(0, NULLNULLNULL, &t_timeout);    // 調用select函數阻塞程序 

程序運行情況

我們將上面編寫好的QueueUse.c文件上傳到Linux機器上,使用“gcc -g -o QueueUseQueueUse.c”命令編譯之后,生成QueueUse文件。之后,執行“QueueUse”命令,即可看到程序的運行結果(結果會不斷地更新)如下:

  1. ~/zhouzx/Test/QueueUse> QueueUse  
  2. PutDataIntoQueue: ID=0, Info=zhou0  
  3. GetDataFromQueue: ID=0, Info=zhou0  
  4. PutDataIntoQueue: ID=1, Info=zhou1  
  5. GetDataFromQueue: ID=1, Info=zhou1  
  6. PutDataIntoQueue: ID=2, Info=zhou2  
  7. GetDataFromQueue: ID=2, Info=zhou2  
  8. PutDataIntoQueue: ID=3, Info=zhou3  
  9. GetDataFromQueue: ID=3, Info=zhou3 

我們看到,數據先是被加入到隊列中,然后再從隊列中取出來。

程序說明

***,在本程序中,入隊列和出隊列是在同一個函數中完成的,但是,在實際開發項目的程序中,入隊列和出隊列一般是在不同的程序流程(兩個不同的線程)中完成的。

第二,本程序的數據入隊列操作是在EnQueue函數中完成的,數據出隊列操作是在DeQueue函數中完成的,全局變量g_tQueue用于存放需要處理的數據。

第三,在實際開發項目的程序中,有可能會有很多流程都會調用入隊列和出隊列的函數,為了防止多個流程同時向隊列中加入數據或取出數據,在EnQueue和DeQueue函數中使用了鎖操作。也就是說,在操作數據之前,先用pthread_mutex_lock函數執行加鎖操作,在處理完數據之后,再用pthread_mutex_unlock函數執行解鎖操作。

第四,在實際開發項目中,為了防止程序從隊列中取數據的速率過快而使得下游模塊處理不過來,我們常在從隊列取出數據之后發消息的流程中控制數據的發送速率,具體每秒鐘發送多少條可在配置文件中設置。

【本文是51CTO專欄作者周兆熊的原創作品,轉載請通過51CTO獲取作者授權】

責任編輯:武曉燕 來源: csdn博客
相關推薦

2016-12-20 11:12:11

C代碼自測開發

2022-12-09 11:46:20

2023-06-09 19:01:03

軟件開發

2023-06-08 16:47:09

軟件開發工具

2022-08-04 10:32:04

Redis命令

2019-11-17 22:11:11

TCPSYN隊列Accept隊列

2021-04-23 09:00:00

開發安全編碼

2011-12-15 01:01:48

ibmdw軟件開發

2023-11-03 10:33:26

2023-02-09 16:48:12

軟件開發測試結對測試

2009-06-12 11:35:28

模式框架軟件設計

2009-07-17 17:29:13

多任務多線程

2023-08-24 09:44:16

數據庫性能

2022-10-12 14:17:39

物聯網軟件開發

2014-10-29 11:12:46

數據安全虹安

2011-01-19 15:33:07

Qmail郵件隊列清除

2023-12-30 13:47:48

Redis消息隊列機制

2011-08-11 09:56:50

模式

2023-12-07 12:59:46

C語言循環隊列代碼

2024-02-02 08:25:34

隊列與棧Python數據結構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美亚洲一区二区三区 | 天天操夜夜操 | 国产伦精品一区二区三区精品视频 | 精品一区二区久久久久久久网精 | 精品视频久久久 | 麻豆av片| 综合伊人 | 精品国产乱码久久久久久1区2区 | 国产成人精品久久二区二区91 | 午夜三级视频 | 欧美日韩在线一区二区三区 | 国产在线精品一区二区 | 夜久久 | 涩涩99 | 欧美在线视频网站 | 亚洲情综合五月天 | av久久| 亚洲a在线观看 | 污片在线观看 | av影音资源 | 午夜网| 91看片在线观看 | 精品乱人伦一区二区三区 | 中文在线观看视频 | 欧美日韩国产一区二区三区 | 国产一级片久久久 | 美女一级黄| 亚洲精品中文字幕av | 欧美理论 | 国产人成精品一区二区三 | 99re在线视频 | 成人免费视频播放 | 精品国产成人 | 日韩激情在线 | 亚洲精品一区在线观看 | 亚洲国产精品一区二区第一页 | 精品欧美激情在线观看 | 中文字幕男人的天堂 | 亚洲成人久久久 | 国产精品一区二区久久 | 久久久一区二区三区 |