Linux系统编程之线程

本文深入探讨Linux系统编程中的线程概念,包括线程与进程的区别、线程API(pthread_create, pthread_join等)、互斥锁原理与应用、条件变量的使用,以及如何避免死锁。通过实例代码解析关键函数的使用,帮助读者理解线程同步的重要性。" 106493992,9448178,解决URLError:WinError 10060 - 连接超时问题,"['深度学习', '机器学习', '神经网络', 'tensorflow', '数据获取']
摘要由CSDN通过智能技术生成

目录

线程和进程的区别:

一、线程相关API

1、线程的创建pthread_create()

2、线程的等待pthread_join()

3、线程的退出pthread_exit()

4、线程ID获取pthread_self()

二、互斥锁相关API

1、什么是互斥锁

2、创建互斥量

3、创建及销毁互斥锁pthread_mutex_init()、pthread_mutex_destroy()

4、加锁及解锁pthread_mutex_lock()、pthread_mutex_unlock()

5、死锁

三、条件变量相关API

条件变量定义

1、定义条件变量

2、初始化条件变量pthread_cond_init()

3、销毁条件变量pthread_cond_destroy()

4、等待条件变量pthread_cond_wait()

5、唤醒条件变量pthread_cond_signal()

6、静态定义与动态定义条件变量 


线程和进程的区别:

        进程是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位,还是线程的容器。

        线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

第一种方法:

        一个进程在运行的时候,要给他分配内存,要维护它的数据段和代码段以及堆栈等等,而线程是跟进程共享这些东西,开辟多个线程不会分配新的内存,和进程相比,它是一种非常"节俭"的多任务操作方式。

第二种方法:

1.根本区别:进程是操作系统进行资源分配的最小单元,线程是操作系统进行运算调度的最小单元。

2.从属关系不同:进程中包含了线程,线程属于进程。

3.开销不同:进程的创建、销毁和切换的开销都远大于线程。

4.拥有资源不同:每个进程有自己的内存和资源,一个进程中的线程会共享这些内存和资源。

5.控制和影响能力不同:子进程无法影响父进程,而子线程可以影响父线程,如果主线程发生异常会影响其所在进程和子线程。

6.CPU利用率不同:进程的CPU利用率较低,因为上下文切换开销较大,而线程的CPU的利用率较高,上下文的切换速度快。

7.操纵者不同:进程的操纵者一般是操作系统,线程的操纵者一般是编程人员。
Linux线程开发常用API

一、线程相关API

        1、线程的创建pthread_create()

#include <pthread.h>
 
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);
 
 
pthread_t *thread:                 pthread是一个指针参数,传出线程ID
const pthread_attr_t *attr:        用于指定线程属性,传入NULL表示使用默认属性
void *(*start_routine) (void *):   是个函数指针,是线程的主控函数
void *arg:                         是第三个函数的参数,要强制转换成泛型(void*)然后进行值 
                                    传递即可,不能传递地址
 
返回值:若成功返回0,否则返回错误编号

        2、线程的等待pthread_join()

#include <pthread.h>
 
int pthread_join(pthread_t thread, void **retval);
 
pthread_t thread:  thread是我们要等待退出的线程的线程ID
void **retval:     retval是传出参数,用于获取线程的退出值,即,pthread_exit里的那个参数
 
在使用该函数时要注意retval参数:
 
(1) 一定要用void**强制转换为泛型指针
 
(2)该函数是将pthread_exit里的退出值 复制到 retval所指向的位置。
 
(3)该参数可以置为NULL,表示不需要获取线程退出值。

        3、线程的退出pthread_exit()

#include <pthread.h>
void pthread_exit(void *retval);
 
void *retval:    retval表示线程的退出值,我们必须将该参数强转为泛型void*

举例,实现线程创建退出

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


void *func1(void * arg){
//      static int ret=10;
        static char *ret="t1 is run out";
        printf("t1: %ld thread is creat\n ",(unsigned long)pthread_self());
        printf("t1: param is %d\n",*((int *)arg));
        pthread_exit((void *)ret);

}


int main(){

        int param=100;
        int ret;
        //int *pret=NULL;//传一个整形参数给phread_join
        char *pret=NULL;//传一个字符串参数给phread_join
        pthread_t t1;
        ret=pthread_create(&t1,NULL,func1,(void *)&param);

        if(ret == 0){

                printf("main:thread craet success\n");
        }

        printf("main: %ld\n ",(unsigned long)pthread_self());
//      while(1);

        pthread_join(t1, (void**)&pret);
//      printf("main t1 quit %d\n",pret);
        printf("main t1 quit %s\n",pret);

        return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值