线程概念:
典型的进程可以看成只有一个控制序列:一个进程在某个时刻只能做一件事情。有了多个控制线程以后,在程序设计时就可以把进程设计成在某一个时刻能够不止做一件事,每个线程处理各自独立的任务。而这个控制序列我们就称它为“线程”。或者可以说,在一个程序里的一个执行路线叫做线程。一个进程至少有一个执行路线。
说起线程,首先可能就会想到进程。那么,线程和进程究竟有什么关系呢?
(1)进程是承担系统分配资源的基本事件。
(2)线程是程序执行的最小单位。
(3)线程共享进程数据,但也拥有自己的一部分数据。
它们的区别在于:
(1)进程是资源分配的单元,而线程是CPU调度的单元。
(2)同一个线程中可以包含多个线程,并且线程共享进程的资源。
(3)进程的创建调用fork或vfork,而线程的创建调用pthread_creat。进程结束后它所拥有的所有线程都会销毁,而线程的结束不会影响同进程中的其他线程。
(4)线程是轻量级进程。它的创建和销毁所需要的时间比进程小得多。所有操作系统中的执行功能都是创建线程去完成的。
(5)线程中执行时一般要进行同步与互斥。因为线程之间共享进程的所有资源,很容易因为资源引起问题。
(6)虽然线程共享进程资源,但每个线程都有自己的私有栈结构。
使用线程的优点:
(1)创建一个新线程比创建一个新进程代价小得多。
(2)与进程相比,线程之间的切换需要操作系统做的工作很少
(3)线程占用的资源比进程少
(4)能充分利用多处理器的可并行效率。
线程的缺点:
(1)性能损失
(2)健壮性降低
(3)缺乏访问控制
(4)编程难度提高
下面附上线程的一段简单代码,主要是为了熟悉pthread_create,pthread_join的使用
#include<stdio.h> 2 #include<pthread.h> 3 #include<string.h> 4 #include<string.h> 5 #include<unistd.h> 6 7 void* thread1(void* arg) 8 { 9 printf("thread1 returning...\n"); 10 int *p = (int*)malloc(sizeof(int)); 11 *p = 1; 12 return (void*)p; 13 } 14 15 void* thread2(void* arg) 16 { 17 printf("thread2 exiting...\n"); 18 int *p = (int*)malloc(sizeof(int)); 19 *p = 2; 20 pthread_exit((void*)p); 21 } 22 23 24 void * thread3(void* arg) 25 { 26 while(1){ 27 printf("thread3 is running...\n"); 28 sleep(1); 29 } 30 return NULL; 31 } 32 33 34 int main() 35 { 36 pthread_t tid; 37 void* ret; 38 39 pthread_create(&tid,NULL,thread1,NULL); 40 pthread_join(tid,&ret); 41 printf("thread return,thread id:%x,return code:%d\n",tid,*(int*)ret); 42 free(ret); 43 44 pthread_create(&tid,NULL,thread2,NULL); 45 pthread_join(tid,&ret); 46 printf("thread return,thread id:%x,return code:%d\n",tid,*(int*)ret); 47 free(ret); 48 49 pthread_create(&tid,NULL,thread3,NULL); 50 sleep(3); 51 pthread_cancel(tid); 52 pthread_join(tid,&ret); 53 if(ret == PTHREAD_CANCELED) 54 printf("thread return,thread id:%x,return code:PTHREAD_CANCELED\n",tid); else 55 printf("thread return,thread id:%x,return code:NULL\n",tid); 56 57 }