2.2 Linux随手简记之线程篇(一)

线程学习篇

  • (一)线程创建

  • 使用pthread_create函数创建线程,需要传递线程执行函数及其参数。
  • 参数传递需要注意类型转换。
  • 需要链接pthread库。
  • 获取线程ID可以调用pthread_self函数。
  • 线程间参数传递需要注意指针类型匹配。
  • 使用pthread_join回收线程,它是一个阻塞函数。
  • (二)线程同步

  • 临界资源指不能同时访问的资源。
  • 使用互斥锁pthread_mutex来保护临界资源。
  • 互斥锁有动态和静态两种创建方式。
  • 互斥锁使用pthread_mutex_lockpthread_mutex_unlock函数来加锁和解锁。
  • 死锁可以通过减少锁数量和调整锁顺序来避免。
  • (三)线程取消

  • 使用pthread_cancel取消线程,需要线程有取消点。
  • 可以设置取消状态为使能或禁止。
  • 可以设置取消类型为延迟取消或异步取消。
  • 线程清理可以使用pthread_cleanup_pushpthread_cleanup_pop函数。
  • (四)其他线程操作

  • 线程分离可以使用pthread_detach
  • 读写锁pthread_rwlock可以提高多线程执行效率。
  • 销毁互斥锁使用pthread_mutex_destroy
  • 结束线程推荐使用pthread_exit
  • (五)线程同步与通信

    互斥锁

  • 互斥锁用于保护临界资源,确保同一时间只有一个线程能够访问该资源。
  • 使用pthread_mutex_lockpthread_mutex_unlock来加锁和解锁。
  • 互斥锁可以静态初始化,也可以动态创建。

    死锁

  • 当两个或多个线程永久地等待对方持有的锁时,发生死锁。
  • 避免死锁的方法包括减少锁的数量、按顺序获取锁等。

    读写锁

  • 读写锁允许同一时刻多个线程读取共享资源,但只能有一个线程写入资源。
  • 使用pthread_rwlock_rdlockpthread_rwlock_wrlock进行读锁和写锁。
  • 读写锁可以提高读取性能,适用于读多写少的场景。

    条件变量

  • 条件变量通常与互斥锁一起使用,用于复杂的线程同步场景。
  • 线程可以在条件变量上等待特定条件成立,直到其他线程发出信号。
  • 线程可以在条件变量上等待或被唤醒。
  • 主要函数有pthread_cond_waitpthread_cond_signalpthread_cond_broadcast

    信号量

  • 信号量是一个整数变量,用于线程间的同步。
  • 使用sem_init初始化信号量,sem_waitsem_post用于P和V操作。
  • 信号量是一个整数变量,用于线程间的同步。
  • 信号量有两种操作:P操作(等待)和V操作(信号)。
  • P操作会检查信号量值,如果大于0,则将其减1并继续执行;如果等于0,则线程会阻塞直到信号量值大于0。
  • V操作会将信号量值加1,如果有线程在等待,则会唤醒一个线程。
  • 主要函数有sem_initsem_waitsem_postsem_destroy

    线程取消

  • 使用pthread_cancel可以取消一个线程的执行。
  • 需要设置取消状态和类型,并在线程中设置取消点。
  • 线程清理函数用于在线程取消时释放资源。
  • 主要函数有pthread_cancelpthread_setcancelstatepthread_setcanceltype
  • 取消线程需要设置取消点,通常是在阻塞系统调用中。

    线程清理

  • 使用pthread_cleanup_pushpthread_cleanup_pop成对使用,在线程退出时自动调用清理函数。
  • 线程清理允许在线程退出时自动执行清理代码。
  • 主要函数有pthread_cleanup_pushpthread_cleanup_pop
  • 清理函数不会在线程正常return时调用,而是在调用pthread_exit、取消线程或执行pthread_cleanup_pop时调用。
  • (六)线程属性与控制

  • 线程属性控制线程的栈大小、分离状态等。
  • 使用pthread_attr_initpthread_attr_destroy初始化和销毁线程属性结构。
  • 可以通过pthread_attr_setdetachstate设置线程分离状态。
  • 主要函数有pthread_attr_initpthread_attr_destroypthread_attr_setdetachstatepthread_attr_getdetachstate
  • (七)错误处理

  • 线程函数通常会返回错误码,需要检查错误码。
  • 使用strerror可以将错误码转换为错误信息字符串。

a3be53a1863b419f8229a34edba9779a.png

 

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式&机器人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值