用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心解决方案电子通信

QNX环境下多线程编程

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-11 00:02:13
thread 为等待终止的目标线程,value_ptr为一指针,当值不为NULL时指向一个内存空间,这个空间用来存放目标线程传给pthread_exit()的数据。调用pthread_join()的线程将被挂起,直到目标线程终止。一个线程仅允许唯一的线程使用pthread_join()等待它的终止,并且被等待的线程应该处于非DETACHED状态。QNX也提供了非POSIX的 pthread_timedjoin(),不同之处是线程在给定时间里没有被join时,此函数会返回一个错误信息。

pthread_detach()
API:  int pthread_detach(pthread_t thread);

    说明:此函数功能是将一给定线程thread分离,当一个出于分离状态的线程终止时,线程拥有的所有系统资源将被立即释放。

    2 QNX线程的互斥和同步机制

    线程间的互斥操作是指对于特定的一段代码或一个变量,在程序运行时只能有一个线程对其进行操作,其他线程不能同时进入代码或修改变量。线程间的同步操作是指若干个线程都等待某个事件的发生,当这个事件发生时,所有的线程同时进行下一步工作。为了防止竞争条件和数据被破坏的情况发生,QNX提供了多种互斥和同步机制,包括互斥体、条件变量、信号灯、屏障、读/写锁、sleepon锁等,其中最主要的是互斥体和条件变量,其余的同步机制都是由他们组合而成的,当然你也可以根据自己的要求构建自己的同步机制。

    互斥体——QNX使用了互斥体来实现互斥操作,在初始化互斥体后,将给定的代码或变量的前后进行加锁、解锁操作,线程在访问之前要先得到互斥体,这样就可以保证只有一个线程能访问到代码或变量,而其余的线程会处于阻塞状态直到互斥体被释放。这种机制保证了线程对资源访问的互斥性,达到了对代码或变量的保护。

    条件变量——QNX的条件变量用来同步线程,所有线程都会等待一个条件变量可用,当条件满足时,一个线程发出广播或信号来同步所有的线程或某一线程。为了防止多个线程同时申请等待而产生竞争,条件变量通常要与互斥体联合使用。

    信号灯——QNX信号灯也是一种符合POSIX标准的的同步机制,它是由互斥体和条件变量结合一些数据构造而成的,QNX系统将其封装在C语言库函数中,头文件是。它的功能很强大,可以允许多个线程访问同一资源,可以通过设定灯值来限定线程的个数,灯值为一时它就是互斥体。

    屏障——POSIX 1003.1j提议的内容,主要由互斥体、条件变量和计数器构造而成。作用是停止某些线程,当所要求的线程数量到达屏障时,所有的线程被允许继续运行。屏障通常被用来确保某些并行算法中的所有合作线程在任何线程可以继续运行以前到达算法中的一个特定点。

    读/写锁——POSIX 1003.1j提议的内容,主要由一个互斥体和两个条件变量构造,两个条件变量分别控制读写操作。读/写锁允许多个线程同时读数据,但是禁止任何线程修改正在被其他线程读或修改的数据,也可以让一个线程独占写访问,但此时任何读访问的线程都不能继续,直到读/写锁被释放,所以读/写锁被用来保护经常需要读但是通常不需要修改的信息。

    Sleepon锁——QNX6所独有的一种同步机制,由一个互斥体和一些数据构造而成,与条件变量相似但是用法比较简单。它与条件变量的不同在于当有N个线程阻塞在M个对象的时候,如果用条件变量来同步时需要用到M个条件变量,而sleepon锁为每个线程自动分配条件变量,只需要N个条件变量,使用合适可以节约系统资源。

    3 多线程程序的设计分析与基本结构

    3.1多线程程序的设计分析
    1)确定完成任务所需的最少线程个数。

    多余的线程只会使程序的复杂性增加,出错的可能性也随之增加。设计程序时要遵循简单、高效、安全的原则,如果用单线程能够很好的完成任务,那么一定不要用多线程。

    2)分析多线程需要共享的数据。

    在多线程程序中常常需要共享一些数据,通常是一些全局变量,如果数据量很大可能需要开辟共享内存区。

    3) 根据共享数据的特点选择需要的保护机制。

    多个线程需要写操作的变量可以用互斥体保护,经常需要读操作而很少进行写操作的可以用读/写锁保护等。

    4) 分析工作线程需要访问资源。

    工作线程可能需要访问硬件,等待硬件响应、可能需要访问某一数据库、也可能不访问任何资源只是进行一些计算等等。这时需要考虑相应的同步机制,可以用条件变量结合互斥体,也可以用更为简单的sleepon锁。

    5)进行线程的清理工作。

    线程完成工作后可能会自动退出,也可能会阻塞在某处,甚至工作线程还没完成工作的时候主线程已经退出,造成整个进程的结束,使程序失败。有多种方法可以完成线程的清理工作,可以让主线程调用pthread_join()函数清理工作线程,可以用屏障同步机制清理,也可以用条件变量来完成清理工作。

    3.2多线程程序的基本结构

    多线程编程的结构有很多种,但基本的编程结构总结起来有三种:流水线结构、工作组结构、客户端/服务器结构。这三种结构可以以任意方式组合,来满足实际工程的需求。

    1) 流水线结构

    在流水线结构中,需要处理的“数据”串行地被一组线程顺序处理,每个线程依次在每个数据元素上执行一个特定的操作,完成操作后将结果传递给

上一页  [1] [2] [3]  下一页

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论

相关文章

PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:6,328.12500 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号