zoukankan      html  css  js  c++  java
  • 多线程

    一。线程概念

    1.线程基本概念

    2.线程之间共享、非共享

    3.线程优缺点

    二。线程控制原语

    1.pthread_self函数

    2.pthread_create函数

     

    3.pthread_exit函数

    4.pthread_join函数

    5.循环创建多线程

    #include<stdio.h>
    #include<pthread.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<string.h>
    void *thread_func(void *arg)
    {
            int i=(int)arg;
            sleep(i);
            printf("I am %d thread,thread id =%lu,pid=%u
    ",i+1,pthread_self(),getpid());
         } int main() { pthread_t thid; int i; int ret; for(i=0;i<5;i++) { ret=pthread_create(&thid,NULL,thread_func,(void *)i); if(ret!=0) { char * str=strerror(ret); fprintf(stderr,"pthread_create error:%s",str); return 0; } } sleep(i); pthread_exit(NULL); //退出当前(主控)线程,不影响子线程
      //  return 0;//退出主控线程,影响子线程
     // exit(1);//退出进程,在任何子线程都会退出进程
    }

    6.回收多个子线程

    #include<stdio.h>
    #include<pthread.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<string.h>
    int var;
    void *thread_func(void *arg)
    {
            int i=(int)arg;
            sleep(i);
            if(i==0)
            {
                    printf("I am %d thread,thread id =%lu,pid=%u
    ",i+1,pthread_self(),getpid());
                    var=100;
                    pthread_exit((void*)var);        //第一个线程返回100
            }else
            {
                    var=300;
                    printf("I am %d thread,thread id =%lu,pid=%u
    ",i+1,pthread_self(),getpid());
            }       pthread_exit((void*)var);    //其余线程返回300
    }
    
    int main()
    {
            pthread_t thid[5];
            int i;
            int ret;
            int *retvar[5];
            for(i=0;i<5;i++)
            {
                    ret=pthread_create((thid+i),NULL,thread_func,(void *)i);
                    if(ret!=0)
                    {
                            char * str=strerror(ret);
                            fprintf(stderr,"pthread_create error:%s",str);
                            return 0;
                    }
    
            }
            for(i=0;i<5;i++)
            {
                    pthread_join(thid[i],(void**)&retvar[i]); //var返回给retvar[i];
                    printf("第%d个进程已回收,retvar=%d
    ",i+1,(int)retvar[i]);
            }
            pthread_exit(NULL);
            return 0;
    }
    

    7.pthread_detach函数

    #include<stdio.h>
    #include<pthread.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<string.h>
    void *thread_func(void *arg)
    {
            int var=100;
            pthread_exit((void*)var);
    }
    int main()
    {
            pthread_t thid;
            void *retvar;
            int ret;
            pthread_create(&thid,NULL,thread_func,NULL);
    
            pthread_detach(thid);  //分离线程
            ret=pthread_join(thid,&retvar);  //回收失败   pthread_join err:Invalid argument
            if(ret!=0)
    {
            fprintf(stderr,"pthread_join err:%s
    ",strerror(ret));
            return 0;
    }
         printf("%d",(int)retvar);
    }
    

      

    8.pthread_cancel

    #include<stdio.h>
    #include<pthread.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<string.h>
    void *thread_func(void *arg)
    {
            while(1)
            {
            pthread_testcancel();      //设置取消点
         }
            pthread_exit((void*)100);
    }
    int main()
    {
            pthread_t thid;
            void *retvar;
            int ret;
            pthread_create(&thid,NULL,thread_func,NULL);
    
            pthread_cancel(thid);    //杀死进程,线程中必须有系统调用 或者 手动设置取消点
            ret=pthread_join(thid,&retvar);
            if(ret!=0)
    {
            fprintf(stderr,"pthread_join err:%s
    ",strerror(ret));
            return 0;
    }
      printf("%d
    ",(int)retvar);       //被杀死的进程retvar=-1
    }
    

     

    9.进程与线程函数对比

    fork pthread_create;

    exit pthread_exit

    wait pthread_join

    getpid pthread_self

      

      

    三。线程属性

    1.线程属性基本函数

     2.设置分离状态

    detachstate取值

    #include<stdio.h>
    #include<pthread.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<string.h>
    void *thread_func(void *arg)
    {
         pthread_cond_timedwait(); //给create有时间返回 int var=100; pthread_exit((void*)var); } int main() {
    pthread_attr_t attr; //定义属性attr pthread_attr_init(&attr); //初始化attr pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); //将attr设置为分离态
    pthread_t thid; void *retvar; int ret; pthread_create(&thid,&attr,thread_func,NULL); //创建时加入attr // pthread_detach(thid); ret=pthread_join(thid,&retvar); if(ret!=0) { fprintf(stderr,"pthread_join err:%s",strerror(ret)); return 0; } printf("%d",(int)retvar); }

    3.调整栈空间

    3.1查看当前属性的状态

     

    3.2设置线程栈空间大小和起始地址

  • 相关阅读:
    mycat分表扩展之全局序列(数据库方式)
    mycat分表扩展之按日期(天)分片
    mycat分表扩展之范围约定
    mycat分表扩展之分片枚举
    jdk导入证书链步骤说明
    oracle md5加密函数
    oracle常用(11g)
    oracle 11g 常规sql
    oracle归档日志
    oracle定时任务
  • 原文地址:https://www.cnblogs.com/sclu/p/11266574.html
Copyright © 2011-2022 走看看