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

线程概述

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

ps: 程序编译时要加 -lpthread

单线程创建

pthread_create函数定义如下
linux系统编程 线程创建(pthread_create函数)_第1张图片

#include
#include
#include
#include
#include
#include
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
#include
#include
#include
#include
#include
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
#include
#include
#include
#include
#include
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;

}

输出如下,说明线程共享全局变量
linux系统编程 线程创建(pthread_create函数)_第2张图片

pthread_exit线程退出

#include
#include
#include
#include
#include
#include
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;

}

你可能感兴趣的:(Linux系统编程,多线程,linux)