linux下线程以及pthread库

Posted 禾田守望者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下线程以及pthread库相关的知识,希望对你有一定的参考价值。

一.概述

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
");
    //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("线程创建失败!
");
        return -1;
    }
    pthread_join(tid, &result);
    printf("创建主线程
");
    printf("result is %s
", result);
    pthread_exit(NULL);  //退出,并返回NULL,有个就不需要return 0了.
}

以上是关于linux下线程以及pthread库的主要内容,如果未能解决你的问题,请参考以下文章

[Linux用户空间编程-7]:pThread线程库-线程管理代码示例

pthread

编译参数中-pthread以及-lpthread的区别

Linux_多线程(进程与线程的联系_pthread库_线程创建_线程等待_线程正常终止_线程取消_线程分离_pthread_t与LWP)

[ Linux ] 线程独立栈,线程分离,Linux线程互斥

[Linux用户空间编程-6]:pThread线程库简介