论坛登陆 注册 文章专区 笑话频道 影视频道 投稿文章 旧版浏览
首页 | 页界资讯 | 网络应用 | 软件应用 | 组网技术 | 网络原理 | 聊天通讯 | 网管知识 | 帮助
笑话 | 操作系统 | 注 册 表 | 编程开发 | 数 据 库 | 媒体动画 | 网页设计 | 图形图象 | 地图
论坛 | 网络安全 | 安全防范 | 服 务 器 | 硬件学堂 | 路由技术 | 搜索研究 | 站长经验 | 投稿
影院 | 教育频道 | 特色专题 | 精文荟萃 | 注 册 码 | 论坛社区 | 网站地图 | 广告服务 | 旧版
设为首页 加入收藏
当前位置:首页>>文章>>操作系统>>Linux>>正文

Linux系统下的多线程编程入门

www.xker.com 作者:pcstudy 来源:blogchina 加入日期:2006-1-17 11:13:48

【问题提问、论坛交流】

  在下面的例子中,我们创建一个键,并将它和某个数据相关联我们要定义一个函数createWindow,这个函数定义一个图形窗口(数据类型为Fl_Window *,这是图形界面开发工具FLTK中的数据类型)由于各个线程都会调用这个函数,所以我们使用线程数据

/* 声明一个键*/
pthread_key_t myWinKey;
/* 函数 createWindow */
void createWindow ( void ) {
 Fl_Window * win;
 static pthread_once_t once= PTHREAD_ONCE_INIT;
 /* 调用函数createMyKey,创建键*/
 pthread_once ( & once, createMyKey) ;
 /*win指向一个新建立的窗口*/
 win=new Fl_Window( 0, 0, 100, 100, "MyWindow");
 /* 对此窗口作一些可能的设置工作,如大小、位置、名称等*/
 setWindow(win);
 /* 将窗口指针值绑定在键myWinKey上*/
 pthread_setpecific ( myWinKey, win);
}

/* 函数 createMyKey,创建一个键,并指定了destructor */
void createMyKey ( void ) {
 pthread_keycreate(&myWinKey, freeWinKey);
}

/* 函数 freeWinKey,释放空间*/
void freeWinKey ( Fl_Window * win){
 delete win;
}

  这样,在不同的线程中调用函数createMyWin,都可以得到在线程内部均可见的窗口变量,这个变量通过函数pthread_getspecific得到在上面的例子中,我们已经使用了函数pthread_setspecific来将线程数据和一个键绑定在一起这两个函数的原型如下:

  extern int pthread_setspecific __P ((pthread_key_t __key,__const void *__pointer));
  extern void *pthread_getspecific __P ((pthread_key_t __key));

  这两个函数的参数意义和使用方法是显而易见的要注意的是,用pthread_setspecific为一个键指定新的线程数据时,必须自己释放原有的线程数据以回收空间这个过程函数pthread_key_delete用来删除一个键,这个键占用的内存将被释放,但同样要注意的是,它只释放键占用的内存,并不释放该键关联的线程数据所占用的内存资源,而且它也不会触发函数pthread_key_create中定义的destructor函数线程数据的释放必须在释放键之前完成

  2、互斥锁

  互斥锁用来保证一段时间内只有一个线程在执行一段代码必要性显而易见:假设各个线程向同一个文件顺序写入数据,最后得到的结果一定是灾难性的

  我们先看下面一段代码这是一个读/写程序,它们公用一个缓冲区,并且我们假定一个缓冲区只能保存一条信息即缓冲区只有两个状态:有信息或没有信息

void reader_function ( void );
void writer_function ( void );

char buffer;
int buffer_has_item=0;
pthread_mutex_t mutex;
struct timespec delay;
void main ( void ){
 pthread_t reader;
 /* 定义延迟时间*/
 delay.tv_sec = 2;
 delay.tv_nec = 0;
 /* 用默认属性初始化一个互斥锁对象*/
 pthread_mutex_init (&mutex,NULL);
 pthread_create(&reader, pthread_attr_default, (void *)&reader_function), NULL);
 writer_function( );
}

void writer_function (void){
 while(1){
  /* 锁定互斥锁*/
  pthread_mutex_lock (&mutex);
  if (buffer_has_item==0){
   buffer=make_new_item( );
   buffer_has_item=1;
  }
  /* 打开互斥锁*/
  pthread_mutex_unlock(&mutex);
  pthread_delay_np(&delay);
 }
}

void reader_function(void){
 while(1){
  pthread_mutex_lock(&mutex);
  if(buffer_has_item==1){
   consume_item(buffer);
   buffer_has_item=0;
  }
  pthread_mutex_unlock(&mutex);
  pthread_delay_np(&delay);
 }
}

  这里声明了互斥锁变量mutex,结构pthread_mutex_t为不公开的数据类型,其中包含一个系统分配的属性对象函数pthread_mutex_init用来生成一个互斥锁NULL参数表明使用默认属性如果需要声明特定属性的互斥锁,须调用函数pthread_mutexattr_init函数pthread_mutexattr_setpshared和函数pthread_mutexattr_settype用来设置互斥锁属性前一个函数设置属性pshared,它有两个取值,PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED前者用来不同进程中的线程同步,后者用于同步本进程的不同线程在上面的例子中,我们使用的是默认属性PTHREAD_PROCESS_ PRIVATE后者用来设置互斥锁类型,可选的类型有PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT它们分别定义了不同的上所、解锁机制,一般情况下,选用最后一个默认属性

本新闻共9页,当前在第5页  1  2  3  4  5  6  7  8  9  

编辑:xker.com

上一篇:让Linux象Windows一样安装卸载
下一篇:没有了
关闭窗口】【浏览次数:】【发送给好友】【收藏此页
相关文章
推荐文章 最新文章 热门文章
·Linux系统下的多线程编程入门
·武林绝技之笔记本操作系统优化
·Fireworks绘制新春贺卡:娃娃放鞭炮(
·制作一条龙 教你如何将下载的电影刻成
·一分钟攻破ADSL 盗遍宽带密码
·Oracle数据库游标使用大全
·Oracle9i中监视索引的使用
·使用Oracle实现实时通信
·制作MP3播放器TXT图书之三剑客
·什么是IPTV
·全面控制Win XP的安装进度过程
·电子图书制作方法之EXE格式篇
·用VC6.0实现快捷方式中的查找目标功能
·实战网络服务器安全配置技巧
·在Java SE中使用Hibernate框架
·Linux系统下的多线程编程入门
·通过.inf文件让Win XP实现自动维护
·武林绝技之笔记本操作系统优化
·微软出品 农历狗年春节桌面方案下载(
·Fireworks绘制新春贺卡:娃娃放鞭炮(
·Live Messenger新功能:音乐同步播
·用Excel把网页上复制来的文本行列互换
·制作一条龙 教你如何将下载的电影刻成
·Photoshop表现质感:打造精美花瓶
·IT小博士:PC电源知识简介
·一分钟攻破ADSL 盗遍宽带密码
·首届网管员推荐实用品牌调查-获奖名
·Google新服务:任何网站生成移动版
·博客网Alexa排名清零事件全透视
·Oracle数据库游标使用大全
·个人简历表格
·免费代理IP(每日更新)
·QQ密码丢失后能做的事情:快速找回密码
·WinRAR 3.51 注册码
·Norton AntiVirus 2006 注册码(激活
·系统优化 专题
·找回QQ密码的注意事项 
·史上最强QQ个人档案资料欣赏
·最经典的黑客入门教材
·求职简历封皮
·怎样查找对方的IP地址
·FlashFXP 3.3.1 build 1089注册码
·2005最新最全注册码集中营(11月更新)
·应届毕业生求职信
·ACDSee v8.0注册码
评论 本站声明
会员名称:
密码:匿名 ·注册·忘记密码?
评论内容:
(最多300个字符)
  查看评论
【注】 发表评论必需遵守以下条例:
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
  • 本站大部分为网络转载,如有版权问题,请通知我们,我们立即更正!

设为首页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2003-2006 xker.com All rights reserved. 网站合作、广告联系QQ:12231446
小新技术网 冀ICP备05002857号