歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix資訊 >> 教你Unix消息隊列的應用

教你Unix消息隊列的應用

日期:2017/3/6 11:40:55   编辑:Unix資訊

我們以前學習過Unix消息隊列的創建、刪除、發送和接收的知識,今天,我們來學習在線程中Unix消息隊列應用以實現多任務線程間的數據共享的知識,洗大家能夠在Unix的學習上有所收獲。

首先在main主函數中創建Unix消息隊列和線程://定義全局變量

  1. Int msqueue_record, msqueue_process;
  2. Void main()
  3. {
  4. pthread_t pthreadID1;
  5. //創建消息隊列,用於線程間通信
  6. msqueue_record = msqueue_create ( “record”, 200, 200);
  7. msqueue_process = msqueue_create ( “process”, 200, 200);
  8. //創建數據采集線程
  9. pthread_create ( &&pthreadID1, NULL, receiveData, NULL);
  10. //創建數據處理線程
  11. pthread_create ( &&pthreadID2, NULL, process, NULL);
  12. //創建數據記錄線程
  13. pthread_create ( &&pthreadID1, NULL, record, NULL);
  14. //等待進程結束
  15. wait_thread_end( );
  16. }


數據采集線程:

  1. void receiveData( )
  2. {
  3. int count;
  4. unsigned char buff[200];
  5. for(;;) {
  6. //從數據口采集數據,並將數據放置於buff中
  7. //wait_data_from_data_port( buff )
  8. //將數據寫入消息隊列msqueue_record中
  9. msqueue_send ( msqueue_record, buff, 200 );
  10. //將數據寫入消息隊列msqueue_process中
  11. msqueue_send ( msqueue_process, buff, 200 );
  12. }
  13. }

記錄線程函數:

  1. void record ( )
  2. {
  3. int num, count;
  4. unsigned char buffer[200];
  5. for ( ;; ) {
  6. count = msqueue_receive ( msg_record, &&buffer, 200 );
  7. if ( count < 0) {
  8. perror ( "msgrcv in record");
  9. continue;
  10. }
  11. //將取到的消息進行記錄處理
  12. //record_message_to_lib();
  13. }
  14. }

數據處理線程函數:

  1. int process( )
  2. {
  3. int count;
  4. unsigned char buffer[200];
  5. for ( ;; ) {
  6. count = msqueue_receive ( msg_process, &&buffer, 200 );
  7. if ( count < 0) {
  8. perror ( "msgrcv in record");
  9. continue;
  10. }
  11. //將取到的消息進行處理
  12. //process_message_data()
  13. }
  14. }

在實現多任務系統時,作者曾經做過以下三種實現方法的比較:進程間通信采用IPC機制,線程間通信采用進程通信方式IPC,線程間通信采用基於作者開發的Unix消息隊列。結果表明:利用用戶下的數據區進行線程間通信的速度最快,效率最高,而IPC方式慢。這次,關於Unix消息隊列我們就講解到這裡了。

Copyright © Linux教程網 All Rights Reserved