前序:
本人菜鸟学生一枚,从5月9号开始学习Linux,到现在整整一个月了,这一个月真的收获很大,特别充实。
由于毕业课题项目提前做完了,论文也写完了,坐等毕业的节奏,但是距毕业还有差不多一年的时间,感觉这段时间不应该就这么荒废掉,应该做点有意义的事情。
之前都是搞裸机项目,从来没有接触操作系统,一直对它挺好奇的,现在终于有了充裕的时间可以干自己想干的事情了,所以决定学习一下Linux。自从入手,真是欲罢不能,这一个月每天的时间基本上都在看书和敲代码。
最开始是从鸟哥的Linux私房菜开始入手的,5月9号买下,5月25号基本看完,后面有些章节没看。5月25号买下apue,开始深入研究这本圣经,在看的时候真是给人一种意犹未尽和欲罢不能的感觉,不愧为一本经典之作。介绍的确实很深入,但大部分还是可以看懂的,很多地方真是值得细细品味。边看书、边敲代码、边时不时的搜一下相关内容的博客补充理解,不知不觉,全书已经看完了一半,现在刚刚看完第12章——线程控制。
自己的能量超乎了我的想象,入手时都说这本书很难,真是有些担心自己看不进去,没想到自己的进度会这么快,更没想到自己居然能激发出这么大兴趣,兴趣真的很重要。
半个月,看完了一半,匆匆走过,是时候回头做做总结了,是时候做点笔记了,就先从线程这一章开始吧。
自己的字太丑了,就用博客记录读书笔记吧!由于是菜鸟,自己的博客仅作自己的学习笔记之用。
线程标识
每个线程都有一个线程标识:线程ID,只在它所属的进程环境中有效。数据类型为:pthread_t
通过调用pthread_self()函数可以获取自己的ID。
pthread_t pthread_self(void);
线程创建
int pthread_create( pthread_t *thread, const pthread_attr_t *attr, void *(*start_rtn)(void *), void*arg );
若线程创建成功,返回0。若线程创建失败,则返回出错编号。
4个参数:
1,thread:线程ID指针
2,attr:设置线程属性
3,start_rtn:线程运行函数起始地址,函数指针
4,arg:线程函数的唯一入口参数,如果是多个参数,可以将把参数存放在一个结构中,然后将结构地址传递给arg。
线程终止
线程终止方式:
(1)线程从启动例程中简单的返回,返回值是线程的退出码;
(2)线程可以被同一进程的其他线程取消;pthread_cancel(pthread_t tid)
(3)线程调用pthread_exit函数。终止该线程,并返回一个指向某一对象的指针,可由其他函数如pthread_join来检索获取。
void pthread_exit(void * retval) //终止状态存于retval指向的单元
等待线程终止并获取终止状态
对于以可结合状态启动的线程(线程属性为PTHREAD_CREATE_JOINABLE)
int pthread_join(pthread_t tid, void ** retval) //
以阻塞方式等待指定线程tid结束,retval
用于获取线程的终止状态。
例:
pthread_t tid;
void * tret;
void* tid_func(void * arg);
pthread_create(&tid,NULL,tid_func,NULL);//创建线程tid
pthread_join(tid,&tret);
注意:要确保调用完成之后,线程返回值指向的内存仍然是有效的。若线程返回值是线程内部定义的局部变量的指针,线程结束后,变量即被释放,此时返回值将变成野指针。
#include "apue.h"
#include <pthread.h>
void * thread_func(void * arg);
char s[]="Hello word!";
int main(void)
{
int res;
#include "apue.h"
#include <pthread.h>
void * thread_func(void * arg);
char s[]="Hello word!";
int main(void)
{
int res;