您的位置:首页 > 编程语言

pthread多线程编程-1

2013-10-31 22:52 218 查看
定义:

线程包含了表示进程内执行环境必须的信息,其中包含进程中标识线程的:线程ID,一组寄存器值,栈,调度优先级和策略,信号屏蔽字,errno变量以及线程私有数据。

进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本,程序的全局变量和堆内存,栈以及文件描述符。

1、线程状态

joinable:当线程退出时,它不会释放其所占用的堆栈和线程描述符,只有当父线程通过调用pthread_join(),才会释放资源;

unjoinable:当线程退出时,它自动释放所有资源;

2、设置线程unjoinable状态

a. pthread_create()执行unjoinable属性;

b. 父线程调用pthread_detach(threadid);

c. 子线程调用pthread_detach(pthread_self()),线程要退出时,调用pthread_exit()即可;

3、创建线程

int pthread_create(newThread, attrs, threadFunc, arg);

newThread--pthread_t 线程ID;

attrs--线程属性

threadFunc--线程主函数,原型为void *pthreadhandler(void *arg);

arg--传递给线程主函数的参数。

返回值:0-OK,否则错误。

注意:线程创建时并不能保证哪个线程先执行:新线程还是调用线程。新线程可以访问进程的地址空间,继承调用线程的浮点环境和信号屏蔽字,但该线程的未决信号集被清除。在信号产生和递送之间的时间间隔内,称信号是未决(pending)的

4、终止线程

如果进程的任一线程调研了exit(),_Exit,或_exit,则整个进程退出。

单个线程退出的方式:

a. 线程主函数返回,返回值是线程退出码;

b. 线程被同一进程中的其他线程取消;pthread_cancel(tid);

c. 线程调用pthread_exit();

当线程通过方式a和c退出时,进程中的其他线程可通过pthread_join(tid, &ret);获得其退出状态。

注意pthread_cancel(tid);并不等待线程退出。

线程清理处理程序

void pthread_cleanup_push(void (*rtn)(void*), void *arg); 设置处理函数

void pthread_cleanup_pop(int execute);

调用清理函数的时机:

a. 调用pthread_exit()时;

b. 响应 pthread_cancel()请求时;

c. 用非0 execute参数调用pthread_cleanup_pop时,如果execute参数为0,清理函数将不被调用。

注意:线程主函数返回而终止时,不会调用清理函数。

正常情况下,线程的终止状态可保存到对该线程调用pthread_join()。但如果线程处于分离状态,线程的底层存储资源可以在线程终止时立即被收回,所以此时不能通过pthread_join()来获取线程的终止状态。

。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: