美文网首页
协程与同步原语

协程与同步原语

作者: hustxujinkang | 来源:发表于2018-07-26 20:40 被阅读0次

多线程的时候,我们会用到同步与互斥。一般是获取互斥锁,其余的线程就会陷入阻塞。但是在协程中,可能出现栈帧切换之后重新获取锁的问题,这时候能获取成功吗?
答案分情况而论,如果是可重入锁,是可以获取成功的,原因可以看可重入锁的定义。

A reentrant lock is a synchronization primitive that may be acquired multiple times by the same thread.

也就是说,内核对于锁属主的判别是基于线程ID的,不要妄想用可重入锁避开不同协程间的资源争用问题。

# coding=utf-8
import threading
lock = threading.RLock()
def consumer():
    x = yield 11
    lock.acquire()
    y = yield x * x
    z = yield y * y
    lock.release()
def producer():
    c = consumer()
    print(next(c))
    lock.acquire()
    print(c.send(11))
    print(c.send(22))
    lock.release()
if __name__ == '__main__':
    producer()

当然,如果采用不可重入锁,这个就更糟糕了,直接就导致所有的协程死掉了。
理论上,操作系统的锁机制可以理解为余量为1的信号量即可,获取和占用都要识别线程ID。

相关文章

  • 协程与同步原语

    多线程的时候,我们会用到同步与互斥。一般是获取互斥锁,其余的线程就会陷入阻塞。但是在协程中,可能出现栈帧切换之后重...

  • Kotlin协程使用

    目录 协程的用法 协程同步异步请求与Rxjava,原生写法的区别与优势 对于协程的理解 1.协程的用法 在安卓中添...

  • 线程进程

    多线程 多进程 协程的异同点 同步异步阻塞和非阻塞的概念 计算密集型任务和IO密集型任务 分布式编程: 同步原语 ...

  • Kotlin学习笔记之 31 协程挂起函数的组合

    首发于公众号: DSGtalk1989 31.协程挂起函数的组合 同步与并发通常情况下,协程中的挂起函数都是同步执...

  • 协程的简单使用

    1、协程作用范围。 全局有效。 生命周期内有效。 1、基本使用。 开启同步协程。 输出: 123 开启异步协程。 ...

  • Kotlin协程

    什么是协程 协程:是一种更为灵活高效的用户线程,能够选择异步还是同步执行,指定运行的线程。异步,同步编程:是指的协...

  • 认识协程

    1、协程是什么? 协程基于线程,它是轻量级线程。协程让异步逻辑同步化,杜绝回调地狱。协程最核心的点就是,函数或者一...

  • kotlin协程

    协程基础 轻量级线程。在一个线程中可以启动多个协程。 在协程中使用同步方式写出异步代码(协程挂起时不会阻塞线程),...

  • Golang并发利用sync.WaitGroup实现协程同步

    协程同步 经常看到有人会问如何等待主协程中创建的协程执行完毕之后再结束主协程,例如如下代码: 执行以上代码很可能看...

  • 简易协程-3

    新增的功能 在《简易协程-2》的基础上增加协程同步等待、IO超时的支持。增加一个新类JoinAction支持协程同...

网友评论

      本文标题:协程与同步原语

      本文链接:https://www.haomeiwen.com/subject/salimftx.html