简 述: 上一篇中讲解了“条件变量 + 互斥量”的组合使用,演示了 “生产者-消费者”模型。本篇讲解 互斥量的升级版:信号量(信号灯) 的理解和使用。互斥量与信号量的关系,可以简单理解为 c 和 c++ 的关系。信号量的使用的步骤,也是和前面的互斥量很像,不过这次的头文件改为了 #include <semaphore.h>:

  • sem_t sem; //定义变量
  • sem_wait(); //加锁
  • …其他代码
  • sem_post(); //解锁
  • sem_destroy(); //销毁

说明:

本例子是在 Linux 下面运行成功的,编译时候,时候需要加参数 -pthread

若是想要在 Mac 运行改程序,需要改写替换部分函数(mac 不支持其中的部分函数)

学习 - Linux

  简 述: 继续上一篇中,讲解了原子⚛操作(粗略看作 cpu 会执行完该几行代码,才会切换到其他的线程)和重点讲解读写锁 的使用。本篇讲解 条件变量 的使用步骤:

  • pthread_cond_t g_cond() //条件变量–阻塞线程,等待条件满足*
  • pthread_cond_init() //初始化
  • pthread_cond_wait() / pthread_cond_timedwait() //阻塞线程(若是条件不满足)
  • …其他代码
  • pthread_cond_signal() / pthread_cond_timedwait() //通知阻塞中的线程解除阻塞
  • pthread_cond_destroy() //销毁
学习 - Linux

  简 述: 上一篇中介绍了多线程使用互斥量(锁)来控制程序的访问公共资源的时候是”串行“的;本篇继续,重点讲解如下几个概念:Linux 中的原子操作死锁原因及解决方法 、和读写锁 和对应的源码小例子。其中读写锁的使用例子,完全可以参考互斥量(锁),其大概流程如下:

  • pthread_rwlock_init()
  • pthread_rwlock_rdlock() / pthread_rwlock_tryrdlock() / pthread_rwlock_wrlock() / pthread_rwlock_trywrlock()
  • 、、、代码片
  • pthread_rwlock_unlock()
  • pthread_rwlock_destroy()
学习 - Linux

  简 述: 在 Linux 中,使用互斥量(互斥锁🔐) Mutex 来给保证多线程 ,在访问公共变量的时候能够 “串行” 代码。从而使得多线程正确的同步执行。关于多线程创建和使用可以参考前面几篇的文章,争取早日把 Linux 系统篇之 系统编程给发布完系列的教程。

PS:好几天没有接着学习 Linux 的系统函数和理论知识了。可能是前面几天有点忙了吧;时间流逝啊,总是这么得快,,,,

关于互斥锁的使用如下:

  • pthread_mutex_t *mutex; //创建一个锁
  • pthread_mutex_init(); //初始化一个互斥锁
  • pthread_mutex_lock(); //上锁🔓,或者使用 pthread_mutex_trylock()
  • pthread_mutex_unlock(); //解锁🔐
  • pthread_mutex_destroy; //销毁互斥锁
学习 - Linux

  简 述: 遇到 “茶壶里面煮饺子” 就不是一件开心的事情了;虽然说,敲代码专心享受的一件快乐的事情,但是与人沟通交流更加重要,经常遇到需要在很短的时间里面,将自己的想法和观点清晰的告诉 她/他 人。

今年过年那一周,付费去专门学习了一下基本的沟通交流,有所改善。觉着很是有效,后整理为笔记,与诸君共享。关于 高效表达 = 定主题 + 搭架子 + 填素材

哲学 - 二十所困惑所思考 > 学习 - 技术之外

  简 述: 上一篇讲解了多线程的入门的知识,如何创建多线程程序,以及从虚拟地址空间和 PCB 分析线程的一些细节。本章再讲述一些线程操作相关的函数:

  • pthread_exit(): 退出一个线程,不会影响其他线程的
  • pthread_jion(): 阻塞等待线程退出,获取线程退出的状态
  • pthread_detach(): 设置线程分离的属性
  • pthread_cancel(): 杀死(取消)一个线程
  • pthread_equal(): 判断两个线程是否相等,预留函数
学习 - Linux

  简 述: 前面几篇,学习了 Linux 下多进程使用 fork() 分析的其构造和原理;这里进一步,探究一下如何创建多线程,以及多线程和多进程之间的差异。最后写几个实例;验证分析。

学习 - Linux

  简 述: 前面几篇,刚写过了父子进程的实例。这里写一个守护进程 的例子,从了解到运用 setsid() ;守护进程也就是脱离于终端,不需要和用户交流的,不受注销影响的后台程序(可理解为 win 中的服务 )。

学习 - Linux

  简 述: 在上一篇中,讲解了 Linux 的系统中基本信号概念入门。这里就说一下两个重要的概念,系统内核里面的 未决信号集阻塞信号集 的状态关系,以及处于用户区域的 自定义的信号集 ,如何处理这三者之间的关系。和 Linux 中的信号捕捉 ,以及捕捉函数相关函数相关的使用。

  • 自定义信号集:
    • sigaddset() //将指定信号置为 1,添加到自定义集中
    • sigdelset() //将指定信号置为 0,添加到自定义集中
    • sigemptyset() //将所有信号置为 0,清空
    • sigfillset() //将所有信号置为 1,填充
    • sigismember() //判断指定信号是否存在,是否为 1
  • 系统信号集:
    • sigprocmask() //将自定义信号集设置给阻塞信号集。
    • sigprocmask() //读取当前信号的未决信号集。参数为输出参数,内核将未决信号集写入 set
  • 信号捕捉:
    • signal() //实现信号捕捉的功能;最简单使用一个函数。
    • sigaction() //同上,多一个额外功能,运行期间能够临时 屏蔽指定信号
学习 - Linux