线程基础知识

线程概念:

典型的进程可以看成只有一个控制序列:一个进程在某个时刻只能做一件事情。有了多个控制线程以后,在程序设计时就可以把进程设计成在某一个时刻能够不止做一件事,每个线程处理各自独立的任务。而这个控制序列我们就称它为“线程”。或者可以说,在一个程序里的一个执行路线叫做线程。一个进程至少有一个执行路线。

说起线程,首先可能就会想到进程。那么,线程和进程究竟有什么关系呢?

(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 }

                                            

猜你喜欢

转载自blog.csdn.net/weixin_36229332/article/details/79802984