当前位置 博文首页 > Scissors_初夏的博客:初夏小谈:全面剖析多线程(三)

    Scissors_初夏的博客:初夏小谈:全面剖析多线程(三)

    作者:[db:作者] 时间:2021-08-27 22:09

    续线程安全

    一、POSIX信号量

    1.信号量是什么?

    信号量顾名思义就是信号的数量即进行资源的计数,它是具有等待队列的计算器。

    2.信号量的功能?

    信号量的作用:主要是实现进程或线程间同步的

    具体说明:

    ? 1.先初始一个资源计数变量

    ? 2.当进行获取资源时,会先进行资源判断。当资源数大于0时,则说明有资源,进行资源数-1,将资源取出,直接返回。若资源数小于0时,则说明没有资源,则阻塞等待。

    ? 3.当进行存放资源时,则进行资源数加1,唤醒等待队列的进程或线程。

    3.相应函数操作:

    ??1.初始化信号量? ?sem_init

    ??2.计数-1后小于0,则等待,否则直接返回? ??sem_wait

    ??3.若资源产出,计数+1,唤醒等待? ??sem_post

    ??4.销毁信号量? ??sem_destroy

    sem_wait里面包含了资源-1的操作,sem_post里面包含了资源+1的操作。这是在内部完成。条件变量则是根据外部条件进行判断。

    4.用POSIX信号量来实现安全队列

    1.先互斥锁来实现

    代码实现:

    结果显示:

    2.用信号量代替锁实现:

    代码实现:

    结果显示:

    说明:

    ? ? ? ?在运行结果显示中出现存放数据和获取数据不同是因为数据更新和打印操作不是原子操作,时间片发生了轮转导致。

    二、读写锁:

    1.读写锁是什么:

    写的时候,即不能读数据也不能写数据。读的时候,可以同时读,但是不可以写。

    读写锁的特性:写互斥,读共享。

    2.读写锁的功能:

    当写的个数大于0时,就不能进行加读锁和写锁操作,二者都阻塞。当读的个数大于0时,则写锁阻塞,但是读锁可以加

    ? ?说明:1.在读写锁中的阻塞使用自旋锁来实现,就是对资源循环判断。而不是进行睡眠去等待别人唤醒。

    ? ? ? ? ? ? ? 2.使用自旋锁的优点:可以及时地进行发现条件满足立即进行操作。

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?缺点:耗费较大的CPU

    ? ? ? ? ? ? ? 3.自旋锁使用场景:用于操作时间很短的情况。

    3.读写锁的使用场景及说明:

    1.使用场景:

    ? ?读写锁通常用于读者数量远远大于写者的情况。但是如果想要加写锁来修改数据,那么就要一直等待下去,因为当进行读时可以一直加读锁。

    2.读写锁说明:

    在Linux内核中读写锁是默认读优先。有些说是写优先是因为读写锁属性中的原本写属性一直有问题,而且功能和读优先是一样的。

    4.使用读写锁体会读者写者

    代码实现:

    结果显示:

    特别注意:

    ? ? ? ? ? ? ? ? 1.由于写者操作是远远少于读者的数量。所以写着操作是极少时。

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?珍&源码

    cs