控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

Linux 线程学习

作者:未知 出处:cnblog 2012年09月20日 阅读:

基本概念

   线程,又称为轻量级线程,是程序执行流的最小单元!进程是分为用户级线程和内核级线程!

 常见的模型有

    线程:进程

     1 :1   指的是 kernel-level thread  ,on Linux  usual c library implement this approach!

     N: 1  指的是 用户级线程! An N:1 model implies that all application-level threads map to a single kernel-level scheduled entity; the kernel has no knowledge of the application threads. With this approach, context switching can be done very quickly and, in addition, it can be implemented even on simple kernels which do not support threading

     对于用户级线程,其好处是能够快速的进行context switch 转换,因为它们之间是没有进入到内核模式下的!缺点就是,不能够利用硬件来加速!因为每次只能有一个thread
能够被processor调用!

2)特点

  线程,是对进程进一步的细分,它的引入是为了更好并发执行程序,提高执行效率。线程之间共享进程资源,一个线程是可以创建或者是撤销一个线程。

  在线程 中 context switch 速度 比在进程间的速度要快很多。线程包含必需的系统资源,比如pc,一些必须的寄存器和堆栈,线程id等!

 3)与进程的区别

    1)进程含有独立的地址空间,而线程是没有的,线程必须在进程中才有!线程是必须依靠线程才能够生存 。一个进程可以看作是一个独立的线程

    2)线程中含有少量的自己必需的状态信息,而进程中则包含大量的信息!

    3)在进程中进行context switch 比在线程中context switch 慢很多!

 4) 线程的创建以及终止

       首先介绍几个比较重要的函数

       这些函数的头文件都是#include<pthread.h>

       int pthread_equal(pthread_t tid1,pthread_t tid2)//比较两个线程id是否相等

       pthread_t  pthread_self(void)//返回的是自己的线程id

       int pthread(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg);//创建一个id

给出一段代码做参考!

#include<pthread.h>
 #include<stdio.h>
 void * func(void *arg)
 {
   printf("the pid of the programming is %d\n",getpid());
   printf("the new thread is :%u\n",pthread_self());
   return ((void*) 0);
 }
 int main()
 {
    pthread_t tid=pthread_self();//tid 是main这个线程的id
    pthread_t ntid;
    printf("the main thread is %u:\n",tid);
    pid_t pid=getpid();
    printf("the pid of the process is %d:\n",pid);
    int err=pthread_create(&ntid,NULL,func,NULL);
    if(err!=0)
      printf("create thread error\n");
    sleep(1);
    return 0;
 
 }

从这个程序中我么可以看到新建的线程和以前的线程是在同一个进程中的,但是它们的线程id是不同的!

 线程的终止:

  1)不能够使用一些比较常用的函数 ,比如说_exit,exit 等函数,在任何一个线程中使用这些函数,将使得进程给终止。

  2)有三种方式来终止一个线程

       1.线程被其他的线程给取消

       2.线程调用pthread_exit() 函数

       3.线程从启动例程中返回,返回的是线程的退出码!

   我们通常用pthread_join()函数来取出线程的退出码

给出个简单利用的例子

#include<pthread.h>
 #include<stdio.h>
 void * func(void *arg)
 {
         printf("the thread1 exit \n");
         pthread_exit((void *)1);
 }
 void * func1(void *arg)
 {
         printf("the thread2 exit \n");
         pthread_exit((void *)2);
 }
 int main()
 {
         int err;
         pthread_t tid1,tid2;
         void *tret;
         err=pthread_create(&tid1,NULL,func,NULL);
         if(err!=0)
                 printf("can't create thread 1:\n");
         err=pthread_create(&tid2,NULL,func1,NULL);
         if(err!=0)
                 printf("can't create thread 2:\n");
         err=pthread_join(tid1,&tret);
         if(err!=0)
                 printf("can't join thread1\n");
         printf("thread1 exit code %d\n",(int)tret);
         err=pthread_join(tid2,&tret);
         if(err!=0)
                 printf("can't join thread2\n");
         printf("thread2 exit code %d\n",(int)tret);
         return 0;
 }

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统