linux下线程以及pthread库

Summer的小屋 2020-04-20

一.概述

linux中不区分进程和线程,都认为是个任务,都是创建一个task_struct.如何区分?线程是共享相同地址空间,而进程是独占地址空间.

多线程共享同一进程的地址空间

优点:

通信方便,可以通过全局变量.

缺点:

访问共享数据时需要考虑同步和互斥.

二.线程共享资源:

可执行的指令

静态数据

进程中打开的文件描述符

当前工作目录

用户ID

用户组ID

三.线程私有资源:

线程ID

PC(程序计数器)和相关寄存器:保证不同线程执行不同的代码.

堆栈

错误号

优先级

执行状态和属性

四.Linux线程库:

pthread线程库:(POSIX)

1.创建线程:

2.回收线程(pthread_join):

pthread_join(pthread_t thread, void **retval)

*retval接收线程thread函数对应的返回值,比如return返回的值或者pthread_exit中的retval.(两者是等效的)

3.结束线程(pthread_exit):

结束当前线程,而exit是结束当前的进程.

pthread_exit(void *retval)相当于return retval;可以是各种类型.

retval可被其他线程通过pthread_join获取.

示例:

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

void * task(void * param)
{
    sleep(5);
    printf("hello\n");
    //pthread_exit(NULL);
    //pthread_exit("子线程执行完毕"); //既可以返回NULL,也可以返回字符串.
    return "子线程执行完毕";
}

int main()
{
    //初始化线程
    pthread_t tid;
void *result;

    //创建线程
    int rc = pthread_create(&tid, NULL, task, NULL);

    if(rc)
    {
        printf("线程创建失败!\n");
        return -1;
    }
    pthread_join(tid, &result);
    printf("创建主线程\n");
    printf("result is %s\n", result);
    pthread_exit(NULL);  //退出,并返回NULL,有个就不需要return 0了.
}

相关推荐