多线程

一。线程概念

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\n",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\n",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\n",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\n",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\n",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\n",strerror(ret));
        return 0;
}
  printf("%d\n",(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设置线程栈空间大小和起始地址

posted @ 2019-07-31 22:07  荼离伤花  阅读(198)  评论(0编辑  收藏  举报