利用最近一周晚上下班回来的闲散时间继续学习boost线程库的使用。在我的上一篇文章《boost c++ lib on linux(3) - thread库的使用初学》中记录了boost线程库的基本使用方法和编译链接,参杂了一些线程互斥变量,本地存储的类的使用。本文记录了本周我学习线程同步条件变量的使用实例,主要实现了生产者消费者模型的队列使用过程,通过多线程条件变量实现生产者消费者模型队列。
这里的一点体会就是,在实现一个书本上的实例的时候,我们不光是简单实现或者将代码重新敲一遍就是,而应该尽量将书本合上,自己思考要实现一个这样的实例应该怎么开始,这样便于对实例理解更加深刻。在编写本实例的时候,我先从队列的基本数据结构开始,实现了一个循环队列的模板类,然后针对该模板类,利用boost的单元测试库设计了单元测试代码,并运行通过所有的单测检查,保证循环队列模板类的代码正确性。基本的循环队列数据结构实现以后就着手开始编写生产者和消费这对这个队列的操作代码,使用boost对线程库编写多线程代码。先验证在没有条件变脸支持的队列在对线程环境下会是什么结果。最后复用循环队列模板代码,重新设计了支持多线程的条件变量的队列数据结构,并做了boost单元测试,保证基本的功能没问题后,重新编译多线程访问队列的代码,并运行查看结果。
在这过程中,我们及学习了基本的boost thread同步条件变量的使用,同时也学习到了:
1、boost 的单元测试的框架的使用方法以及在编译过程中应该注意的事项;
2、巩固和复习了模板类的编写和使用,代码的复用(这里我没有直接继承非多线程的循环队列的类,偷了懒直接复制代码来改了实现多线程版本的循环队列);
3、学会了在多目录情况下工程代码的管理和Makefile.am的编写和代码编译;
4、体会了一把linux环境下相对完整的软件编写,以及利用单元测试框架保证代码模块质量的过程;
工程的目录结构如图所示:
src目录下面是生产这消费者模型及多线程调用的实现代码,unittest下面是单元测试代码。
configure.in内容如下,用于指定生成Makefile文件等:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([unittest/TestQueueTemplate.cpp])
#AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
AC_CHECK_HEADER_STDBOOL
# Checks for library functions.
#AC_CONFIG_FILES([Makefile
# src/Makefile
# unittest/Makefile])
AC_OUTPUT([Makefile src/Makefile unittest/Makefile])
Makefile.am:
SUBDIRS=src unittest
Queue.h & Queue.cpp:
/*************************************************************************
> File Name: Queue.h
> Author: Liu Xin
> Created Time: 2012年11月05日 星期一 21时03分32秒
************************************************************************/
#ifndef _QUEUE_H_
#define _QUEUE_H_
template <class type>
class Queue
{
public:
Queue(){}
Queue(int sz);
void enqueue(type t);
type* dequeue();
type* get_front();
type* get_tail();
bool is_empty();
bool is_full();
int queue_size();
void print_queue();
protected:
type* buf;
int size;
int front;
int tail;
};
#endif
/*************************************************************************
> File Name: Queue.cpp
> Author: Liu Xin
> Created Time: 2012年11月05日 星期一 21时06分01秒
************************************************************************/
#include "Queue.h"
#include <iostream>
using namespace std;
template <class type>
Queue<type>::Queue(int sz){
buf = NULL;
buf = new type[sz];
size = sz;
front &#