跳到主要内容

GS中的多线程

· 阅读需 21 分钟
沈予卿
技术中心

基础概念

  • 并发和并行
    • 吃饭吃到一半,电话来了,一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
    • 吃饭吃到一半,电话来了,停了下来接了电话,接完后继续吃饭,这说明你支持并发。
    • 吃饭吃到一半,电话来了,一边打电话一边吃饭,这说明你支持并行。
  • 线程和协程:GS支持多线程,多协程,默认的调度器中有N个线程调度M个协程(一般M远大于N),一般N的个数会配置为略大于核数,启动时通过 /s 指定,如果过大,一个进程开了远多于核数的线程,会增加线程间切换的开销,对性能不会提升反而会下降;配得太小,无法充分利用多核性能,所以是略大于核数,具体还是看使用场景,如果有非常大量的IO操作,多开点线程还是有好处的
  • 跨域/域锁:GS使用域(domain)来保证数据的多线程安全,一个域可以看成是一个互斥锁,当访问某个对象的时候,就会加锁,读写操作结束后再释放锁,这个过程称作跨域,
  • RW/RO对象:普通对象都是RW(read-write)对象,即一定会和某个域绑定在一起,确保访问数据的线程安全,如果对象的文件中有#pragma parallel,说明是RO(read-only)对象,只能有parallel或readonly的成员变量,且所有方法都是parallel的