zoukankan      html  css  js  c++  java
  • 线程

    进程的特点:

      进程有独立地地址空间。

      LINUX为每个进程创建task_struct

      每个进程都参与内核调度,互不影响

    线程的特点:

      进程在切换时,系统开销大,引入轻量级进程LWP

      同一进程中的线程共享相同的地址空间

      Linux不区分进程,线程,统一由task_struct来管理所有进程和线程。

      通常线程指共享地址空间的多个任务

      线程提高任务切换效率,避免额外TLB&cache的刷新

      

    线程的创建

     1 #include <pthread.h>
     2 
     3 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*routine)(void *), void *arg);
     4 
     5 //成功返回0,失败返回错误码
    //错误码不可由perror打印,可由strerror打印
    6 //参数: 7 // thread 线程对象 8 // attr 线程属性,NULL代表默认属性 9 // routine 函数指针--线程执行的函数 10 // arg 传递给routine的参数,参数是void* 11 12 pthread_t pthread_self(void) //参考自己的TID

    测试程序:

    1、创建一个线程,参考线程的tid与pid

     1 #include <pthread.h>
     2 #include <stdio.h>
     3 #include <string.h>
     4 
     5 void *function1(void *arg)
     6 {
     7     printf("this is thread function1
    ");
     8 }
     9 
    10 int main()
    11 {
    12     pthread_t tid;
    13     int err;
    14     err = pthread_create(&tid, NULL, function1, NULL);
    15     if(err!=0)
    16     {
    17         printf("create thread: %s
    ",strerror(err));
    18         return -1;
    19     }
    20 
    21     sleep(2); //主进程退出太快,会导致子线程来不及打印
    22 }

      通过命令行查看线程

      ps -eLf | grep xxxx

    线程退出

      如果进程中的任意线程调用了exit_Exit_exit函数,那么整个进程就会终止。 

      那如何退出线程,又不影响其他人?

      1.直接返回 return 
      2.被其他线程取消 
      3.线程自己调用pthread_exit

    1 #include <pthread.h>
    2 void pthread_exit(void *retval);
    3 
    4 //retval:线程结束时的返回值,可通过pthread_join接收

    线程回收

    1 #include <pthread.h>
    2  
    3 int pthread_join(pthread_t pthread, void **retval);
    4 
    5 //成功返回0,失败返回错误码
    6 //thread为要回收的线程对象
    7 //调用线程阻塞直到thread结束
    8 //*retval接收线程thread的返回值

    测试程序:

     1 #include <pthread.h>
     2 #include <stdio.h>
     3 #include <string.h>
     4 #include <stdlib.h>
     5 
     6 void *funct(void *arg)
     7 {
     8     printf("this is thread funct
    ");
     9     sleep(1);
    10     pthread_exit("funct exit");
    11 }
    12 
    13 int main()
    14 {
    15     int re,i;
    16     pthread_t tid;
    17     re = pthread_create(&tid, NULL, funct, (void*)i);
    18     
    19     void *retval;
    20     pthread_join(tid, &retval);
    21     printf("retval=%s
    ",(char *)retval);
    22     sleep(2); //主进程退出太快,会导致子线程来不及打印
    23 }
    exit / join

    取消线程

    线程的两种状态

    线程的状态----joinable和detached

  • 相关阅读:
    利用cookie实现iframe刷新时停留在当前页面
    css定位学习经验记录
    用div加css做表格去掉外围边框
    利用css中的background-position定位图片
    css3实现圆形逐渐减少动画
    The Best Path
    3998
    YAPTCHA(hdu2973)
    1556 计算
    1808: 地铁
  • 原文地址:https://www.cnblogs.com/y4247464/p/12102078.html
Copyright © 2011-2022 走看看