1,__clone函数简介
#include <sched.h>
int __clone(int (*fn)(void *fnarg), void *child_stack, int flags, void
*arg);
这是一个比fork更精确的产生进程的方式
第一个参数(*fn)(void *fnarg)是一个函数指针,当执行子进程时调用这个函
数.
第二个参数child_stack是指向你为子进程分配的堆棧的指针,
第三个参数flag通过把多种CLONE_*标志进行“或”操作来得到.
CLONE_VM 父进程和子进程运行在同一内存空间(在可应用的地方共享内存映
像) !若不设置,和fork一样,子进程接受它自己的 份父进程内存空间副本.
CLONE_FS 父进程和子进程共享在root文件系统,当前工作目录及umask信
息. !若不设置,子进程接受父进程文件系统信息的副本,彼此独立.
CLONE_FILES 父进程和子进程共享文件描述符 !若不设置,子进程仍然会继承
父进程的文件描述符,但对这些文件描述符的read,write,open和close操作都不会
影响到父进程.反之亦然.
CLONE_SIGHAND 父进程和子进程共享设置在父进程上的信号处理器 !若不设
置,子进程仍然继续一份父进程的信号处理副本,但在子进程中的sigaction调用
不会影响父进程的信号处理器,反之亦然.
CLONE_PID 父进程和子进程有相同的PID !若不设置,子进程接受一个惟一的
PID.
第四个参数arg被传送给子函数,它的取值和用法完全自主决定.
2,pthread接口
应用线程场合:
#在返回前阻塞的I/O任务能够使用一个线程处理I/O, 同时继续执行其它处理.
#需要响应的任何用户界面(UI)能够使用一个或多个线程进行后台处理,同时
保持对用户输入的响应.
#在一个或多个任务不确定性事件,比如网络通信或一种稀有资源的可获得性影
响的场合,能够使用线程处理这些异步事件同时继续执行正常的处理.
#如果某些程序功能比其它的功能更重要,可以使用线程以保证所有功能都出
现,但那些时间密集型的功能具有更高的优先级.
1》pthread_create函数
#include <pthread.h>
int pthread_create(pthread_t *thread,
pthread_attr_t *attr,
void *(*start_routine)(void*).
void *arg);
//thread保存新线程的标识符.
2》pthread_exit 函数
#include <pthread.h>
void pthread_exit(void *retval);
3》pthread_join函数
它挂起当前线程,直到th指定的线程终止运行为止.
#include <pthread.h>
int pthread_join(pthread_t th,void **thread_return);
int pthread_detach(pthread_t th);
//如果另一个线程的返回值不为NULL,则保存在hread_return指向的地址中.
//第二个函数使线程处于被分离的状态.
4》pthread_atfork函数
#include <pthread.h>
int pthread_atfork(void (*prepare(void),
void (*parent)(void),
void (*child)(void));
//它登记了3个处理函数,它们在创建一个新线程的某些时候被调用.
prepare指向的函数在创建新线程之前被调用.
parent函数在父进程中随后被调用,
child指向的函数在子进程一创建好就在子进程中被调用.
它们都可以为NULL,被忽略.
//这个函数可能被POSIX 线程标准除去, 要谨慎使用.
5》取消线程pthread_cancel
#include <pthread.h>
int pthread_cancel(pthread_t thread);
int pthread_setcanclestate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);
void pthread_testcancel(void);
//pthread_setcancelstate函数可以设置自己的取消夶,如果state为
PTHREAD_CANCEL_ENABLE,则允许請求取消.state为PTHREAD_CANCEL_DISABLE,忽
略取消請求.
//pthread_setcanceltype改变一个线程对取消請求的响应试.如要type为
PTHREAD_CANCEL_ASYNCHRONOUS,线程会被立即取消,type为
PTHREAD_CANCEL_DEFERRED则会延迟取消线程直到达到一个取消点.
//pthread_testcancel设置取消点.如果有任何被 挂起的取消請求,这个函数
这会取消当前 线程.
/*这里测试过的pthread_setcancelstate 失效,不解*/
6》pthread cleanup 宏
宏 pthread_cleanup_push宏登记了一个处理函数routine,当调用pthread_exit
终止线程或者线程允许取消請求求同时又达到了一个取消点时,就用arg指定的空
指针参数 调用这个处理函数.
#include <pthread.h>
void pthread_cleanup_push(void (*routine), (void *),void *arg);
void pthread_cleanup_pop(int execute);
void pthread_cleanup_push_defer_np(void (*routine)(void*),void *arg);
void pthread_cleanup_pop_restore_np(int execute);
7》pthread 条件
#include <pthread.h>
pthread_cond_t cond = pthread_cond_initiallizer;
//pthread_cond_init 初始化一个类型为cond_t的对象 cond.
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t
*cond_attr);
// 第二个参数被Linux忽略.多数 linux只是简单的把
PHTREAD_COND_INITIALIZER复制 给cond_attr.
int pthread_cond_signal(pthrad_cond_t *cond);
//这是用于重启一个并且 是惟一的一个正在等待条件的线程.
int pthread_cond_broadcast(pthread_cond_t *cond);
//重启所有正在等待条件的线程.
int pthread_cond_wait(pthread_condt *cond,pthread_mutex_t *mutex);
int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex_t
*mutex,const struct timespec *abstime);
//它只等待abstime指定的时间,使用经典 的UNIX紀元时间,即从1970.1.1 至
今的时刻的秒数. 故与系统调用time返回值兼容.
int pthread_cond_destroy(pthread_cond_t *cond);
// 它只是检查没有线程正在等待条件的情况.
8》pthread_equal函数
如果两个线程引用了同一个线程,则函数返回一个非零舉,否则它返回0.
#include <pthread.h>
int pthread_equal(pthread_t thread1, pthread_t thread2);
3,线程属性.
线程属性控制着一个线程在它整个生命周期里的行为.
属性 值 含义
detachstate PTHREAD_CREATE_JOINABLE(默认) 可切入 的状态
PTHREAD_CREATE_DETACHED 被分离的状态
schedpolicy SCHED_OTHER(默认) 正常,非实时
SCHED_RR 实时,循环
SCHED_FIFO 实时,先入先出
schedparam 与策略有关
inheritsched PTHREAD_EXPLICIT_SCHED(默认) 由schedpolicy和schedparam设
置,从父进程继承.
PTHREAD_INHERIT_SCHED 进程继承
scope PTHREAD_SCOPE_SYSTEM(默认) 一个线程一个系统时间片,线程共享系
统时间片
PTHREAD_SCOPE_PROCESS
4,互斥
加锁和解锁
任何线程都能访问解锁互斥但它却不归任何线程所有.
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, const
pthread_mutexattr_t *mutexattr);
//mutexattr可取值
PTHREAD_MUTEX_INIALIZER 创建一个快速互斥
PTHREAD_MUTEX_RECURSIVE_MUTEX_INITIALIZER_NP 创建一个递归互斥
PTHREAD_MUTEX_ERRORCHECK_MUTEX_INITIALIZER_NP 创建一个检错互斥
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
//不在mutex已经加锁时阻塞调用线程,而是立即返回出错代码EBUSY.
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
//清除mutex引用 的互斥并且释放互斥占有的任何资源.
本