LinMao's Blog
学习科研记录与分享!

C语言多线程编程

线程&进程

进程是资源分配的最小单位,线程是程序执行的最小单位。

进程是一个程序的一个实例,拥有自己独立的各种段(数据段,代码段等等),每次创建一个进程需要从操作系统分配这些资源给他,消耗一定的时间,在linux下C语言创建一个进程使用fork()函数;

线程是一个轻量级的进程,除了自己少数的资源,不用用其他资源,且一个进程可以创建多个线程,这些线程共享进程的资源,创建线程的时间要比创建进程少很多,从函数角度是使用clone()创建。

使用线程处理文件I/O或者socket处理都是非常有优势的,将一个大任务分解成若干个小任务,每个线程处理一个任务,线程之间切换不需要花很多时间,而且线程之间数据交换很方便,共享存储区。

 

多线程相关的函数

线程创建函数

函数原型定义:

其返回值是一个整数,若创建进程成功返回0,否则,返回其他错误代码。

参数含义:

线程变量名pthread_t *类型,是标示线程的id,一般是unsigned long类型,这里也可以是引用类型,目的是用于返回创建线程的ID;

线程的属性指针:制定线程的属性,比如线程优先级初始栈大小等,通常情况使用NULL;

创建线程的程序代码:一般是函数指针,进程创建后执行该函数指针指向的函数;

程序代码的参数:若线程执行的函数包含由若干个参数,需要将这些参数封装成结构体,并传递它的指针;没有传递参数的使用NULL。

 

返回当前线程ID函数

函数原型定义:

用于返回当前线程的ID。

 

线程等待结束函数

函数原型定义:

这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。成功返回0,否则返回错误的编号。

参数含义:

第一个参数表示要等待的进程的id;

第二参数表示要等待的进程的返回状态,是一个用户定义的指针,用来存储被等待线程的返回值,是个二级指针;不需要返回值可以使用NULL

 

线程结束函数

函数原型定义:

参数是指针类型,用于存储线程结束后返回状态。如果参数不是NULL,这个返回值会直接送到pthread_join(pthread_t tid, void ** retval)函数中的返回值中。

 

pthread_exitpthread_join的区别

pthread_joinpthread_join 两个函数都有结束线程的作用,但是又有很大区别:

pthread_join一般来是主线程来调用,用来等待子线程退出,因为是等待,所以是阻塞的自,一般主线程会依次join所有它创建的子线程。

pthread_join一般是子线程调用,用来结束当度前线程。子线程可以通过pthread_exit传递一个返知回值,而主线程通过pthread_join获得该返回值,从而判断该子线程的退出是道正常还是异常。

 

Reference:

Linux 下多线程(C语言)

pthread_join/pthread_exit的用法解析

赞(2) 打赏
转载请注明出处:LinMao's Blog(林茂的博客) » C语言多线程编程

评论 6

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    对于C语言中有多线程的情况,使用gcc编译需要加上多线程编译选项。
    发现有两个多线程的编译选项,一个是 -pthread;一个是 -lpthread。
    但是使用 -lpthread的时候要注意应该把这个编译选项放到源文件之后,不然会报错;而 -pthread选项没有位置要求。
    参考:https://bbs.linmao.dev/?thread-49.htm

    linmao5年前 (2020-05-01)回复
  2. #2

    关于pthread_join函数第二个参数void**类型想得不是很明白,mark一下

    linmao5年前 (2020-05-01)回复
  3. #3

    博主,你的博客用的哪家的服务器。

    XSCAPE3年前 (2022-02-02)回复
  4. #4

    博主你好,今晚我们下馆子不?

    tianqi1年前 (2023-07-03)回复
    • 现在才看到,啥时候能再下顿馆子啊…

      linmao1年前 (2023-10-14)回复

LinMao's Blog(林茂的博客)

了解更多联系我们

觉得文章有用就打赏一下作者吧~

支付宝扫一扫打赏

微信扫一扫打赏