linux下c语言的多线程编程分享

函数成功,返回0,否则返回非0。

  #include<pthread.h>  #include<stdio.h>  #include<stdlib.h>  #include<string.h>  #include<errno.h>  void * func1(void * arg)  {   while(1)   {    printf("fun run...n");    sleep(1);   }   return NULL;  }  int main()  {   pthread_t t1;   if(pthread_create(&t1,NULL,func1,NULL)!=0)   {    printf("thread_create Failed:%sn",strerror(errno));    return -1;   }   sleep(5);   pthread_cancel(t1);   pthread_join(t1,NULL);   return EXIT_SUCCESS;  }

 函数执行结果:

linux下c语言的多线程编程

上面我们说过创建一个线程函数pthread_create的第二个参数,用来决定创建线程的一些初始化状态,这里我们 举个例子,改线程一创建就是分离状态的线程(

上面介绍了pthread_detach函数的概念,可以通过pthread_attr_t在创建线程的时候就指定线程属性为detach,而不用创建以后再去修改线程属性。

先上一段代码:

  #include<pthread.h>  #include<stdio.h>  #include<stdlib.h>  #include<string.h>  #include<errno.h>  void * func(void * arg)  {   int i=0;   for(;i<5;i++)   {    printf("func run%dn",i);    sleep(1);   }   int * p = (int *)malloc(sizeof(int));   *p=11;   return p;  }  int main()  {   pthread_t t1;   pthread_attr_t attr;//申明一个attr的结构体   pthread_attr_init(&attr);//初始化结构体   pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//设置线程为分离线程   int err = pthread_create(&t1,&attr,func,NULL);   if(err!=0)   {    printf("thread_create Failed:%sn",strerror(errno));   }else{    printf("thread_create successn");   }   pthread_attr_destroy(&attr);   pthread_join(t1,NULL);   printf("主线程退出n");   return EXIT_SUCCESS;  }

pthread_attr_t就是我们要传入的参数的结构体,一般申明的步骤有

1,申明一个pthread_attr_t对象

2,函数pthread_attr_init初始化attr结构。

3,设置线程的一些属性,比如pthread_attr_setdetachstate函数就是设置该线程创建的时候为正常状态还是分离状态。

4,函数pthread_attr_destroy释放attr内存空间

pthread_attr_setdetachstate把线程属性设置为下面两个合法值之一:

说明

PTHREAD_CREATE_DETACHED

设置线程为分离状态

PTHREAD_CREATE_JOINABLE

设置线程为正常状态

上面函数运行结果:

linux下c语言的多线程编程

因为线程是个分离状态的,所以pthread_join挂起会失效,主线程很快运行结束,程序也就结束了,创建的线程还没来得及运行

线程同步

有时候我们多个线程处理订单扣减库存会遇到这样的问题,两个线程同时进入一段代码先查询库存,两个都查出来为还剩一件库存,第一个线程用掉这个库存后,将库存变为0,但是第二个线程刚才也查出来为1了,所以他还认为有库存,

这个时候操作就会引发我们想不到的意外,库存变为负数了!!所以这个时候就需要使用线程的同步!!

先上一段代码看看效果:

  #include<pthread.h>  #include<stdio.h>  #include<pthread.h>  #include<stdio.h>  #include<stdlib.h>  #include<string.h>  #include<errno.h>  void * func(void * arg)  {   int threadno =*(int*)arg;   int i=0;   for(;i<10;i++)   {    printf("%d thread%d n",threadno,i);    sleep(1);   }   return NULL;  }  int main()  {   pthread_t t1,t2;   int i1=1,i2=2;   pthread_create(&t1,NULL,func,&i1);   pthread_create(&t2,NULL,func,&i2);   pthread_join(t1,NULL);   pthread_join(t2,NULL);   printf("主线程退出n");   return EXIT_SUCCESS;  }

函数运行结果:

linux下c语言的多线程编程

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/488590.html

(0)
上一篇 2020年11月12日
下一篇 2020年11月12日

精彩推荐