码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Linux线程基础


    目录

    一,线程函数

    1、创建一个线程

    2、获取自身线程ID

    3、线程终止

    4、取消正在执行线程

    5、线程等待

    6、线程分离

    二,线程的使用

    1,线程等待和线程分离

    (1)、线程等待

    (2)、线程分离

    (3)、线程等待线程分离同时进行

    三,互斥量接口

    1、初始化互斥量

    (1)、静态分配

    (2)、动态分配

    2、互斥量销毁

    3、互斥量加锁

    4、互斥量解锁

     四,线程互斥

    1、发现问题

    2、加锁解决


    一,线程函数

    1、创建一个线程

    需要注意用的时候要链接线程库 -lpthread才可以.

    (1)、thread:线程id

    (2)、attr:设置线程属性,一般不设置传nullpr。

    (3)、start_rootine:函数指针,线程跑起来执行的方法。

    (4)、arg:线程方法的参数,安规范随便传,又是会传this,有非常的巧妙。

    2、获取自身线程ID

    3、线程终止

    (1)、retval:输出线参数,不要传临时变量,将来这个会带回线程退出的退出码。

    (2)、线程是不关心信号的,线程出错了那就是进程的错,线程崩掉整个进程都会崩掉。只要出错就找进程这个老大,就是进程的错,问责进程。

    4、取消正在执行线程

     

    字面意思,传需要的线程id

    5、线程等待

    (1)、线程也是需要等待的,类比进程等待,不然会有资源无法释放。

    (2)、thread:线程id

    (3)、retval:一个指针,指向线程的返回值,为什么是二级指针,因为线程方法函数返回值是一个void*的指针,我们要得到一个指针,就要传指针的地址,也就是二级指针。

    (4)、如果thread线程被别的线程调用pthread_ cancel异常终掉,value_ ptr所指向的单元里存放的是常数PTHREAD_ CANCELED(pthread_canceled)。

    6、线程分离

    (1)、不关心线程的返回值,我们就可以直接线程执行的时候设置线程分离,这样就不需要进行线程等待消耗时间了,线程再执行结束的时候自动释放自己的资源。

    (2)、可以别人分离,也可以自己分离。

    (3)、joinable和分离是冲突的,一个线程不能既是joinable又是分离的。

    二,线程的使用

    1,线程等待和线程分离

    (1)、线程等待

     

     

    (2)、线程分离

    (3)、线程等待线程分离同时进行

          不可以同时进行:线程分离的同时又线程等待,线程等待是会失败的,也就是说你以为资源没有回收,起始以及回收了。

       等待失败,并且导致进程收到信号退出了。 

     

    三,互斥量接口

    1、初始化互斥量

    (1)、静态分配

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER

    静态分配的使用完了之后不需要销毁

    (2)、动态分配

    int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict
    attr);

    mutex:要初始化的互斥量
    attr:NULL

    2、互斥量销毁

    int pthread_mutex_destroy(pthread_mutex_t *mutex);

    3、互斥量加锁

    int pthread_mutex_lock(pthread_mutex_t *mutex);
    互斥量处于未锁状态,该函数会将互斥量锁定,同时返回成功。
    发起函数调用时,其他线程已经锁定互斥量,或者存在其他线程同时申请互斥量,但没有竞争到互斥量,那么pthread_ lock调用会陷入阻塞(执行流被挂起),等待互斥量解锁。

    4、互斥量解锁

    int pthread_mutex_unlock(pthread_mutex_t *mutex);
     

     四,线程互斥

    1、发现问题

          多线程访问统一个临界资源是,如果对临界资源的访问修改不是原子性质的,那么可能出问题。

    一个抢票的例子:五个线程同时抢票

    结果是错的,票已经没有了,还抢到了0号票、这么多人抢到了0号票,那么这个作为该给谁啊,这不就扯蛋蛋了、、完犊子啊。

     

    原因就是--操作,和if判断都不是原子操作的。再次执行结果也是不一样的,每次都可能不一样。

     如何解决呢

    2、加锁解决

    对临界区进行加锁:

    这下结果就正确了

    所以以后再多线程情况下访问修改临界资源的时候一定要进行加锁保护临界资源。

     

     

     

     

  • 相关阅读:
    用HTML + javaScript快速完成excel表格信息除重并合并
    Mybatis------Mybatis基本操作
    Spring-事务
    跳槽有技巧?超强测试开发面试经验等你pick
    Shell基本语法--流程控制
    SkyWalking安装部署
    iNFTnews | “幻核”停售数字藏品,腾讯元宇宙又将如何发展?
    js:运用JavaScript写一个倒计时模版
    猿创征文 |【Ant Design Pro】使用ant design pro做为你的开发模板(三) 接入mock数据做持续开发
    【备战csp-j】 csp常考题目详解(4)
  • 原文地址:https://blog.csdn.net/weixin_50374599/article/details/128101944
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号