linux系统编程之创建线程、循环创建N个线程、线程共享全局变量

本文介绍了如何在Linux环境下使用pthread_create函数创建线程,详细解析了函数参数及其工作原理。通过示例展示了线程的创建过程,包括主控线程与子线程的交互以及线程ID的差异。此外,还讨论了线程间的全局变量共享,并通过循环创建线程来验证这一特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pthread_create函数

  • 功能:创建一个新线程。 其作用,对应进程中fork() 函数

  • Int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
    void *(*start_routine) (void *), void *arg)

  • 返回值:成功:0; 失败:错误号 -----Linux环境下,所有线程特点,失败均直接返回错误号

  • 参数:

  1. pthread_t:当前Linux中可理解为:typedef unsigned long int pthread_t;

  2. 参数1:传出参数,保存系统为我们分配好的线程ID

  3. 参数2:通常传NULL,表示使用线程默认属性。若想使用具体属性也可以修改该参数。

  4. 参数3:函数指针,指向线程主函数(线程体),该函数运行结束,则线程结束。

  5. 参数4:线程主函数执行期间所使用的参数

创建线程

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>

void *thrd_func(void*arg)
{
 prrintf("In thread;thread id=%lu,pid=%d\n",pthread_self(),getpid());//子线程id
 return NULL;
}
  
int main()
{
  pthread_t tid;
  int ret;
  printf("In main 1:thread id=%lu,pid=%u\n",pthread_self(),getpid());//主控线程id
  ret=pthread_create(&tid,NULL,thrd_func,NULL);//主控线程
  if(ret!=0)
  {
     printf("pthread_create error\n");
     exit(1);
  }
  printf("In main 2:thread id=%lu,pid=%u\n",pthread_self(),getpid());
  return 0;
}

输出:
在这里插入图片描述
主控线程输出,pid输出;但是,子线程没有输出,原因:是因为线程还没来得及输出,父线程return了,退出进程地址空间

修改:

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
void *thrd_func(void*arg)
{
 prrintf("In thread;thread id=%lu,pid=%d\n",pthread_self(),getpid());//子线程id
 return NULL;
}
  
int main()
{
  pthread_t tid;
  int ret;
  printf("In main 1:thread id=%lu,pid=%u\n",pthread_self(),getpid());//主控线程id
  ret=pthread_create(&tid,NULL,thrd_func,NULL);//主控线程
  if(ret!=0)
  {
     fprint(stderr,"pthread_create error;%s\n",strerror(ret));
     
     exit(1);
  }
  printf("In main 2:thread id=%lu,pid=%u\n",pthread_self(),getpid());
  sleep(1);//主控线程等1秒
  return 0;//退出进程地址空间
}

输出:
在这里插入图片描述
从输出结果看出:主控线程和子线程的线程id不同,但是进程id相同

循环创建线程

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
void *thrd_func(void*arg)
{
  int i=(int)arg;
  sleep(i);//为了使创建的线程有先后顺序
 prrintf("%d thread;thread id=%lu,pid=%d\n",i+1,pthread_self(),getpid());//子线程id
 return NULL;
}
  
int main()
{
  pthread_t tid;
  int ret,i;
  
  for(i=0;i<5;i++)
  {
    ret=pthread_create(&tid,NULL,thrd_func,void *)i);//主控线程
   if(ret!=0)
    {
     fprint(stderr,"pthread_create error;%s\n",strerror(ret));
     
     exit(1);
    }
  }
  
  sleep(i);//主控线程等1秒
  return 0;//将当前进程退出,退出进程地址空间
}

创建线程时,每一个线程函数都相当于一个回调函数,当线程创建成功后,函数自动调用;

注意:i值的使用,采用的是值传递的方式

在这里插入图片描述

功能:验证线程共享全局变量

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int var=100;
void *thrd_func(void*arg)
{
  var=200;
 prrintf(" thread\n");//子线程id
 return NULL;
}
  
int main()
{
  pthread_t tid;

  printf("at first var=%d\n",var);
  
 pthread_create(&tid,NULL,thrd_func,NULL);//主控线程
  
  sleep(1);
  printf("after pthread_create,var=%d\n ",var);
  return 0;//将当前进程退出,退出进程地址空间
}

输出:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值