QNX环境下多线程编程
1.13 线程的终止
QNX中终止一个线程需要调用pthread exit(),其API定义:
void pthread exit( void* value ptr );
当一个线程在执行了start routine()函数后返回时,系统自动隐式调用pthread exit()使其退出,start routine()
的返回值,作为线程的退出状态。在一个线程中也可以显式调用pthread exit()退出,对于单线程进程而言,调用pthread exit()与调用exit(0)是等效的。
1.2 线程的常用控制函数
pthread_self()
API: pthread_t pthread_self(void);
说明:返回线程描述符,pthread_create()返回值相同。
pthread_equal()
API: int pthread_equal(pthread_t t1,pthread_t t2);
说明:t1,t2为线程描述符,可调用pthread_self()和pthread_create()得到。此函数功能为比较两个线程的描述符,不管线程描述符是否合法。如果返回值为非零说明两个线程是同一线程,为零说明两个线程不是同一线程。
pthread_join()
API: int pthread_join(pthread_t thread, void** value_ptr);
说明: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提议的内容,主要由互斥体、条件变量和计数器构造而成。作用是停止某些线程,当所要求的线程数量到达屏障时,所有的线程被允许继续运行。屏障通常被用来确保某些并行算法中的所有合作线程在任何线程可以继续运行以前到达算法中的一个特定点。
&nb
《QNX环境下多线程编程(第2页)》