Linux 线程

【1】什么是线程

1. 概念

线程:是一个进程并发执行多个任务的机制。

并发:多个任务同时进行。(cpu以ms级别的速度进程调度,切换进程和线程);

进程的上下文切换:

    上下文:运行一个程序所需要的所有资源。
    上下文切换:替换原有内容,是一个耗时的操作。

为了提高系统的性能,引入一个轻量级的进程概念,称之为线程。

线程:属于进程,每一个进程至少需要一个线程作为指令执行体,线程运行在进程空间内。

多线程:一个进程中,有多个线程在运行

2. 线程是程序运行的最小单位(重点)

同一个进程下的线程,共享该进程的虚拟地址空间。(每个线程共享其附属进程的所有资源)

共享:

  1. 数据段(全局变量,静态变量,堆)

  2. 正文段

  3. 文件描述符

不共享:

栈区,每个线程都有自己的栈区,用来存放各自的局部变量。

3. 进程和线程的区别 (面试重点)

  1. 进程之间相互独立,有自己独立的用户空间,是独立的个体。

    因此,进程之间的通信需要引入进程间通信机制。

  2. 同一个进程下的线程,共享进程的虚拟地址空间,不需要引入通信机制,但是需要注意线程之间的同步互斥。

  3. 进程是资源分配的最小单位,线程是程序运行的最小单位

  4. 创建子进程需要克隆父进程的所有资源,但是创建多线程不需要,因为本身就共享进程的资源。

    所以,创建多线程的效率比多进程高。

  5. 进程与进程之间相互独立,所以多进程的稳定性比多线程高。

【2】线程常用的函数

man pthread_mutex_init

1)安装man手册

sudo apt-get install manpages-de  manpages-de-dev  manpages-dev glibc-doc manpages-posix-dev manpages-posix
Compile and link with -pthread.

2)pthread_create

功能:创建一个线程;
头文件:
       #include 
原型:
       int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
                          void *(*start_routine) (void *), void *arg);
参数:
    pthread_t *thread:存储创建后的线程id号,tid;
    pthread_attr_t *attr:线程属性,填NULL,代表默认属性;
    void *(*start_routine) (void *):函数指针,回调函数,线程的执行体;
                                    需要传入一个函数的资质,该指针能指向 返回值是void*类型,且参数列表是void*类型的函数。
    void *arg:传入回调函数的参数;
返回值:
    成功,返回0;
    失败,返回错误码,非0;        

注意:

  1. 线程是依附于进程的,如果进程退出(主线程退出),则同一进程下的线程都会强制被回收;

  2. 分支线程退出,不会影响到其他线程的运行

  3. 主线程和分支线程是并行性的,谁先运行不确定,主要根据cpu调度来执行,一般来说,主线程先运行。

3)pthread_exit

功能:退出线程;
头文件:
       #include 
原型:
       void pthread_exit(void *retval);
参数:
    void *retval:传递线程退出的状态值,可以是任意类型的数据地址,也可以填NULL;
                    可以被 pthread_join函数接收;
​

没有pthread_join函数,则退出线程的资源没有被回收,类似僵尸进程;

4)pthread_join

功能:阻塞等待指定分支线程退出,并回收线程资源;
头文件:
       #include 
原型:
       int pthread_join(pthread_t thread, void **retval);
参数:
    pthread_t thread:指定要回收的线程tid号;
    void **retval:获取线程退出的状态值;如果不想接收填NULL;
​
返回值:
    成功,返回0;
    失败,返回错误码,非0;     
#include 
#include 
#include 
#include 
#include 
​
//方法2:
int ret = 3;
void* function(void* ar

你可能感兴趣的:(C,Linux,linux,C)