linux多线程相关知识
1.1、线程相关知识
1、相关概念:
我们所说多线程,简单概括就是在同一时刻可以做不同的事情,也就是说每一个线程都在做各自的事情,当然进程也是可以,但是线程相比于进程来说,更为方便和节省空间:
2、线程的优点:
进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构的汇集。
从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。
线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源。
“进程——资源分配的最小单位,线程——程序执行的最小单位”;
总的来说就是:进程有独立的地址空间,线程没有单独的地址空间(同一 进程内的线程共享进程的地址空间)。
那么我们总结一个问题:使用线程的理由:
a、 使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。
我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。
b、使用多线程的理由之二是线程间方便的通信机制。
对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。
1.2、 线程的创建,等待,及其退出:
相关API
a、pthread_create():创建一个线程
原型 int pthread_create(pthread_t *t1,const pthread_attr_t* attr,(void*)(*start_rtn) (void*),void *arg);
t1:指向线程标识符的指针,注意他是指针
attr:用来设置线程属性
start_rtn:传递一个参数的地址,注意这个参数实际上是一个函数指针
arg:传递给线程的参数
b、 pthread_join():阻塞当前的线程,直到另外一个线程运行结束
int pthread_join(pthread_t t1,void **retval);
返回值:0是成功,非0失败
t1需要等待的线程,注意,他不是指针
retval:用户定义的指针,用来存储被等待线程的返回值
c、pthread_exit():终止当前线程
在不终止整个进程的前提下,一个线程终止有如下三种方式:
a.线程从例程中返回
b.线程可以自己调用pthread_exit()终止自身
c.其他线程可以调用pthread_cancel()终止其它进程,调用pthread_cancel后,被要求取消的线程不会立刻停止,会一直运行到取消点,然后检测是否需要停止。
1.3 、1.2编程实践
1.图示:
2运行结果:
线程运行五次之后,将结束本线程。
自己亲身实践,如有错误,敬请指正,望明天更好。