我们以前学习过Unix消息队列的创建、删除、发送和接收的知识,今天,我们来学习在线程中Unix消息队列应用以实现多任务线程间的数据共享的知识,洗大家能够在Unix的学习上有所收获。
首先在main主函数中创建Unix消息队列和线程://定义全局变量
- Int msqueue_record, msqueue_process;
- Void main()
- {
- pthread_t pthreadID1;
- //创建消息队列,用于线程间通信
- msqueue_record = msqueue_create ( “record”, 200, 200);
- msqueue_process = msqueue_create ( “process”, 200, 200);
- //创建数据采集线程
- pthread_create ( &&pthreadID1, NULL, receiveData, NULL);
- //创建数据处理线程
- pthread_create ( &&pthreadID2, NULL, process, NULL);
- //创建数据记录线程
- pthread_create ( &&pthreadID1, NULL, record, NULL);
- //等待进程结束
- wait_thread_end( );
- }
数据采集线程:
- void receiveData( )
- {
- int count;
- unsigned char buff[200];
- for(;;) {
- //从数据口采集数据,并将数据放置于buff中
- //wait_data_from_data_port( buff )
- //将数据写入消息队列msqueue_record中
- msqueue_send ( msqueue_record, buff, 200 );
- //将数据写入消息队列msqueue_process中
- msqueue_send ( msqueue_process, buff, 200 );
- }
- }
记录线程函数:
- void record ( )
- {
- int num, count;
- unsigned char buffer[200];
- for ( ;; ) {
- count = msqueue_receive ( msg_record, &&buffer, 200 );
- if ( count < 0) {
- perror ( "msgrcv in record");
- continue;
- }
- //将取到的消息进行记录处理
- //record_message_to_lib();
- }
- }
数据处理线程函数:
- int process( )
- {
- int count;
- unsigned char buffer[200];
- for ( ;; ) {
- count = msqueue_receive ( msg_process, &&buffer, 200 );
- if ( count < 0) {
- perror ( "msgrcv in record");
- continue;
- }
- //将取到的消息进行处理
- //process_message_data()
- }
- }
在实现多任务系统时,作者曾经做过以下三种实现方法的比较:进程间通信采用IPC机制,线程间通信采用进程通信方式IPC,线程间通信采用基于作者开发的Unix消息队列。结果表明:利用用户下的数据区进行线程间通信的速度最快,效率最高,而IPC方式慢。这次,关于Unix消息队列我们就讲解到这里了。
【编辑推荐】