欢迎来到天天文库
浏览记录
ID:37904085
大小:54.00 KB
页数:8页
时间:2019-06-02
《UNIX多线程数据共享与线程同步》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、UNIX多线程数据共享与线程同步http://www.sina.com.cn2001/12/19 17:33 赛迪网-中国计算机报 文/杨海平、姚洪利 在UNIX中,一个进程让另外实体进行某项事务而采取的操作为fork的一个子进程,子进程只是将父进程的数据区拷贝一份到自己的数据区。在符合POSIX标准的UNIX操作系统下,同一个进程的线程之间共享进程指令、大多数数据(线程私有数据除外)、信号处理方式、进程运行环境等。由于线程共享进程的全局变量,因此可以采用用户自己编写的消息队列来实现数据的共享。 建立多任务模型,
2、并用线程来实现 符合POSIX标准的UNIX操作系统提供了线程的控制函数,如:线程的创建和终止、线程之间的互斥、线程之间的同步等。利用这些系统函数可以成功地模拟消息队列,来实现线程间数据共享和同步,以完成多任务的实时性。为成功地描述线程间数据共享和同步,以下列任务模型为例。 首先建立消息队列属性数据结构 #defineMAXQUEUE30 typedefstructmq_attrib{ charname[20]; pthread_mutex_tmutex_buff; pthread_mutex_
3、tmutex_cond; pthreadcond_tcond; intmaxElements; intelementLength; intcurElementNum; caddr_tbuff; }mq_attrib,mq_attribstruct,mq_attrib_t; mq_attrib_tmsqueue[MAXQUEUE]; 数据结构定义了消息队列的名字name,最大消息个数maxElements,单个消息长度elementLength,当前消息个数curElementNum,存放消
4、息的缓冲区buff,保护缓冲区锁mutex_buff,线程同步条件变量cond,保护线程同步条件变量锁mutex_cond。 消息队列的创建 依据此数据结构进行消息队列的创建,函数为msqueue_create(参数解释:name消息队列名,maxnum消息的最大个数,length单个消息的长度)。 intmsqueue_create(name,maxnum,length) charname; intmaxnum,length; { inti; for(i=0;i if(msqueue[i]=
5、=NULL)break; //如果消息队列全部被分配,返回错 if(i==MAXQUEUE)returnMQERROR; msqueue[i]=malloc(sizeof(mq_attribstruct)); sprintf(msqueue[i]->name,"%s",name); msqueue[i]->maxElements=maxnum; msqueue[i]->elementLength=length; msqueue[i]->curElementNum=0; msqueue[i
6、]->buff=malloc(maxnumlength); //对保护锁进行初始化 pthread_mutex_init(&&msqueue[i] ->mutex_buff,NULL); pthread_mutex_init(&&msqueue[i] ->mutex_cond,NULL); //对线程同步条件变量初始化 pthread_cond_init(&&msqueue[i]->cond,NULL); returni; } 应用消息队列进行消息的发送和接收 发送消息到消息队列:
7、 消息队列的发送和接收是在不同的线程中进行的。首先介绍发送消息到消息队列的函数: intmsqueue_send(id,buff,length) intid,length; caddr_tbuff; { intpos; //消息队列id错,返回错 if(id<0
8、
9、id>=MAXQUEU)returnMQERROR; //消息长度与创建时的长度不符,返回错 if(length!=msqueue[id]->elementLength)returnMQERROR; //消息队列满,不能发送
10、 if(msqueue[id]->curElementNum>=msqueue[id]->maxElements) returnMQERROR; //在对消息队列缓冲区操作前,锁住缓冲区,以免其他线程操作 pthread_mutex_lock(&&msqueue[id]->mutex_buff); pos=msq
此文档下载收益归作者所有