linux系统编程 线程创建(pthread_create函数)

线程概述

1.线程(light-weight process)轻量级进程,也有PCB;
2.从内核看进程和线程是一样的,都有各自不同的pcb,但是PCB中指向内存资源的三级页表是相同的。
3.进程可以蜕变成线程
4.线程可以看做寄存器和栈的集合。
5.linux下,线程是最小的执行单元;进程是最小的分配资源单位。

ps: 程序编译时要加 -lpthread

单线程创建

pthread_create函数定义如下
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<pthread.h>
void* thrd_func(void* arg)
{
    printf("in func: thread ID = %lu, pid=%u\n",pthread_self(),getpid());
    //打印线程ID
    return NULL;
}
int main()
{
    pthread_t tid;
    int ret;
    pid_t pid;
    printf("in main1:  thread  ID=%lu, pid=%u\n",pthread_self(),getpid());//主控线程
    ret=pthread_create(&tid,NULL,thrd_func,NULL);//创建新进程
    /*1.tid传出参数
    2.设置线程属性
    3.执行函数,返回void*
    4.函数的传入参数void*
    */
    if(ret!=0)
    {
        printf("pthread_create error\n");
        exit(1);
    }
    sleep(1);
    printf("in main2:  thread  ID=%lu,pid=%u\n",pthread_self(),getpid());//主控线程
    
    return 0;

}

循环创建线程

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<pthread.h>
void* thrd_func(void* arg)
{
    //int i=*((int*)arg);//对应传参如果是(void*)&i;
    //不能用取地址的形式,因为线程是一起创建的,i值早变了
    //i的值是不确定的,此时取的i值不是创建此线程的i值
    //如果在循环中加sleep()可以用这种方式。
    int i=(int)arg;
    sleep(i);
    printf("in func: %dth thread ID = %lu, pid=%u\n",i+1,pthread_self(),getpid());
    //打印线程ID
    return NULL;
}
int main()
{
    pthread_t tid;
    int ret,i;
    pid_t pid;
    printf("in main1:  thread  ID=%lu, pid=%u\n",pthread_self(),getpid());//主控线程
    for(i=0;i<5;i++)
    {
        ret=pthread_create(&tid,NULL,thrd_func,(void*)i);//创建新进程
        /*1.tid传出参数
          2.设置线程属性
          3.执行函数,返回void*
          4.函数的传入参数void*
          */
        if(ret!=0)
        {
            printf("pthread_create error\n");
            exit(1);
        }
    }
    sleep(i);
    printf("in main2:  thread  ID=%lu,pid=%u\n",pthread_self(),getpid());//主控线程

    return 0;

}

线程间共享全局变量

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<pthread.h>
int val=200;
void* thrd_func(void* arg)
{
   // printf("in func: thread ID = %lu, pid=%u\n",pthread_self(),getpid());
    //打印线程ID
    val=100;
    printf("val changed!\n");
    return NULL;
}
int main()
{
    pthread_t tid;
    int ret;
    pid_t pid;
    printf("main1:  val= %d\n",val);
    //printf("in main1:  thread  ID=%lu, pid=%u\n",pthread_self(),getpid());//主控线程
    ret=pthread_create(&tid,NULL,thrd_func,NULL);//创建新进程
    /*1.tid传出参数
    2.设置线程属性
    3.执行函数,返回void*
    4.函数的传入参数void*
    */
    if(ret!=0)
    {
        printf("pthread_create error\n");
        exit(1);
    }
    sleep(1);
    printf("main2:  val= %d\n",val);
    //printf("in main2:  thread  ID=%lu,pid=%u\n",pthread_self(),getpid());//主控线程
    
    return 0;

}

输出如下,说明线程共享全局变量
在这里插入图片描述

pthread_exit线程退出

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<pthread.h>
void* thrd_func(void* arg)
{
    sleep(1);
    printf("in func: thread ID = %lu, pid=%u\n",pthread_self(),getpid());
    //打印线程ID
    return NULL;
}
int main()
{
    pthread_t tid;
    int ret;
    pid_t pid;
    ret=pthread_create(&tid,NULL,thrd_func,NULL);//创建新进程
    /*1.tid传出参数
    2.设置线程属性
    3.执行函数,返回void*
    4.函数的传入参数void*
    */
    if(ret!=0)
    {
        printf("pthread_create error\n");
        exit(1);
    }
    printf("in main:  thread  ID=%lu,pid=%u\n",pthread_self(),getpid());//主控线程
    pthread_exit((void*)1); //只是主控线程退出,进程并没有结束,因此子线程可以继续打印输出
    return 0;

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值