创建一个线程:

进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位。每一个进程都有一个自己的地址空间,即进程空间或(虚空间)。进程空间的大小 只与处理机的位数有关,一个 16 位长处理机的进程空间大小为 216 ,而 32 位处理机的进程空间大小为 232 。进程至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。

线程,在网络或多用户环境下,一个服务器通常需要接收大量且不确定数量用户的并发请求,为每一个请求都创建一个进程显然是行不通的,——无论是从系统资源开销方面或是响应用户请求的效率方面来看。因此,操作系统中线程的概念便被引进了。线程,是进程的一部分,一个没有线程的进程可以被看作是单线程的。线程有时又被称为轻权进程或轻量级进程,也是 CPU 调度的一个基本单位。

关系:进程拥有一个完整的虚拟地址空间,不依赖于线程而独立存在;反之,线程是进程的一部分,没有自己的地址空间,与进程内的其他线程一起共享分配给该进程的所有资源。

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

Compile and link with -pthread.

1#include<stdio.h>2#include<pthread.h>3#include<stdlib.h>4void*thread_run(void*id)5{6while(1)7{8printf("thisisathread\n");9sleep(1);10}11return(void*)0;12}1314intmain()15{16pthread_ttid;17intret=pthread_create(&tid,NULL,thread_run,NULL);18while(1)19{20printf("thisismainthread\n");21sleep(2);22}23return0;24}

运行结果:两个线程同时执行自己代码

2.线程等待:int pthread_join(pthread_t thread, void **retval);(以阻塞形式等待)

Compile and link with -pthread.

1#include<stdio.h>2#include<pthread.h>3#include<stdlib.h>4void*thread_run(void*id)5{6intcount=5;7while(count--)8{9printf("thisisathread\n");10sleep(1);11}12return(void*)0;13}1415intmain()16{17pthread_ttid;18intret=pthread_create(&tid,NULL,thread_run,NULL);19intcount=10;20while(count--)21{22printf("thisismainthread\n");23sleep(2);24}25void*retval=0;26pthread_join(tid,&retval);27printf("retval:%d\n",(int)retval);28return0;29}

3.线程终止(4种)

(1)exit(1)直接终止进程

1#include<stdio.h>2#include<pthread.h>3#include<stdlib.h>4void*thread_run(void*id)5{6intcount=5;7while(count--)8{9printf("thisisathread\n");10sleep(1);11}12exit(1);13}1415intmain()16{17pthread_ttid;18intret=pthread_create(&tid,NULL,thread_run,NULL);19intcount=10;20while(count--)21{22printf("thisismainthread\n");23sleep(2);24}25void*retval=0;26pthread_join(tid,&retval);27printf("retval:%d\n",(int)retval);28return0;29}

运行结果

(2)pthread_exit((void*)s);

#include <pthread.h>

void pthread_exit(void *retval);

Compile and link with -pthread.

1#include<stdio.h>2#include<pthread.h>3#include<stdlib.h>4void*thread_run(void*id)5{6intcount=5;7intret=3;8while(count--)9{10printf("thisisathread\n");11sleep(1);12}13pthread_exit((void*)ret);14}1516intmain()17{18pthread_ttid;19intret=pthread_create(&tid,NULL,thread_run,NULL);20intcount=10;21while(count--)22{23printf("thisismainthread\n");24sleep(2);25}26void*retval=0;27pthread_join(tid,&retval);28printf("retval:%d\n",(int)retval);29return0;30}

(3)线程可被取消:

#include <pthread.h>

int pthread_cancel(pthread_t thread);

Compile and link with -pthread.

a.被自己取消

1#include<stdio.h>2#include<pthread.h>3#include<stdlib.h>4void*thread_run(void*id)5{6intcount=5;7while(count--)8{9printf("thisisathread\n");10sleep(1);11}12pthread_cancel(pthread_self());13}1415intmain()16{17pthread_ttid;18intret=pthread_create(&tid,NULL,thread_run,NULL);19intcount=10;20while(count--)21{22printf("thisismainthread\n");23sleep(2);24}25void*retval=0;26pthread_join(tid,&retval);27printf("retval:%d\n",(int)retval);28return0;29}

b.被主线程取消

1#include<stdio.h>2#include<pthread.h>3#include<stdlib.h>4void*thread_run(void*id)5{6intcount=5;7while(count--)8{9printf("thisisathread\n");10sleep(1);11}12}1314intmain()15{16pthread_ttid;17intret=pthread_create(&tid,NULL,thread_run,NULL);18intcount=3;19while(count--)20{21printf("thisismainthread\n");22sleep(1);23}24pthread_cancel(tid);25void*retval=0;26pthread_join(tid,&retval);27printf("retval:%d\n",(int)retval);28return0;29}

1#include<stdio.h>2#include<pthread.h>3void*pthread_run1(void*arg)4{5intcount=5;6while(count--)7{8printf("thisisapthread,id:%d,pthread_id:%u\n",(int)arg,pthread_self());9}10return(void*)1;11}12void*pthread_run2(void*arg)13{14intcount=5;15while(count--)16{17printf("thisisapthread,id:%d,pthread_id:%u\n",(int)arg,pthread_self());18}19pthread_exit((void*)2);20}21void*pthread_run3(void*arg)22{23intcount=5;24while(count--)25{26printf("thisisapthread,id:%d,pthread_id:%u\n",(int)arg,pthread_self());27}28pthread_cancel(pthread_self());29}30intmain()31{32pthread_ttid1,tid2,tid3;33pthread_create(&tid1,NULL,pthread_run1,(void*)1);34pthread_create(&tid2,NULL,pthread_run2,(void*)2);35pthread_create(&tid3,NULL,pthread_run3,(void*)3);36void*ret=NULL;37pthread_join(tid1,&ret);38printf("pthread_id:%u,ret:%d\n",tid1,(int)ret);39pthread_join(tid2,&ret);40printf("pthread_id:%u,ret:%d\n",tid2,(int)ret);41pthread_join(tid3,&ret);42printf("pthread_id:%u,ret:%d\n",tid3,(int)ret);43return0;44}

线程的分离:在任何一个时间点上, 线程是可结合的( joinable)或者是分离的( detached) 。一个可结合的线程能够被其他线程收回其资源和杀死。在被其他线程回收之前,它的存储器资源(例如栈)是不释放的。 相反, 一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动动释放。

1#include<pthread.h>2#include<stdio.h>3void*pthread_run(void*arg)4{5intcount=5;6while(count--)7{8printf("thisisthread\n");9sleep(1);10}11}12intmain()13{14pthread_ttid;15pthread_create(&tid,NULL,pthread_run,NULL);16void*ret=NULL;17pthread_detach(tid);18sleep(1);19pthread_join(tid,&ret);20printf("ret:%d,errstring:%s\n",(int)ret,strerror((int)ret));21}

在设置分离后,依旧等待退出,会返回错误码。