zoukankan      html  css  js  c++  java
  • Chromium中多线程及并发技术要点(C/C++)

    类别说明演示样例

    线程机制

    Thread(參考:线程模型及应用指南)

     
    MessagePump 
    MessageQueue 
    SequencedWorkerPool
    它是一个线程池,用于运行须要串行运行的任务请求,这些请求根据不同的Token分组,仅仅在同样组内保证运行顺序。
    这样多个组能够并行运行,而单个组则是串行运行。比方:不同实例所相应的分组不同。或者不同的功能相应不同的分组。
    它同一时候同意指定当退出时未运行的任务怎样处理,包含:继续运行,忽略,阻止退出。
     
    并发控制机制volatile

    语言基于处理器提供的特性。

    保证各个线程读数据时为最新的值。

    但它的使用须要掌握一定的技巧。

    參考: C/C++ Volatilekeyword深度剖析

     
     

    Atomic32 

    (base/atomicops.h)

    AtomicSequenceNumber (base/atomic_sequence_num.h)

    AtomicRefCountXxx

    (base/atomic_ref_count.h)

    Chromium提供的原子数据类型。 
     

    AutoLock

    AutoUnlock

    Lock

    (base/synchronization/lock.h)

    非常接近于Java的Synchronized。Lock和AutoLock非常好理解。

    AutoUnlock的行为

    与AutoLock类似,建构时release lock, 在析构时acquire lock.

    *应用了RAII idiom。

    cookie_manager.cc

    *AutoUnlock的演示样例:

    media/filters/audio_renderer_impl.h

     WaitableEvent
    (base/synchronization/waitable_event.h)

    以异步的调用完毕操作,在调用端以一个WaitableEvent等待任务完毕.

    基于Lock + ConditionVariable实现。


     ConditionVariable
    (base/synchronization/condition_variable.h)

    条件变量的C/C++实现。主要方法:

         Wait
         TimeWait
         BroadCast
         Singal 

    InProcessCommandBuffer

     CancellationFlag
    (base/synchronization/cancellation_flag.h)
    基于原子操作。提供一个布尔值标志的设定和查询。 
    WTF提供的机制atomicXXX
    (wtf/Atomics.h)
    WebKit提供的原子类 
     Mutex
    (wtf/TreadingPrimitives.h)
    相互排斥量的实现 (对平台化的抽象)
    和base中的Lock系列类似。

    Mutex m_mutex;

    {
      MutexLocker locker(m_mutex);

      ......

    }

     

    MutexLock

    (wtf/TreadingPrimitives.h)

     RecursiveMutex
    (wtf/TreadingPrimitives.h)
     MutexTryLocker (wtf/TreadingPrimitives.h)
     ThreadCondition
    (wtf/TreadingPrimitives.h)
    条件变量的实现 
    并发容器

    ThreadLocalBoolean

    ThreadLocalPointer

    (base/threading/thread_local.h)

    TLS (Thread Local Stoage) 的实现
    在ThreadRestrictions中有ThreadLocal的应用:
    LazyInstance<ThreadLocalBoolean>::Leaky
        g_io_disallowed = LAZY_INSTANCE_INITIALIZER; 
     ThreadSafeDataTransport
     (wtf/ThreadSafeDataTransport.h)
    以线程安全的方式在一对生产者和消费者之间利用SharedBuffer传递数据。降低线程冲突和数据拷贝。

    ImageFrameGenerator.h

     很多其它的说明
     LazyInstance

    函数中静态成员初始化不是线程安全的,easy出现隐患 (C++11已经声称能够保证)。能够使用base::LazyInstance()来解决, 同一时候LazyInstance能够避免内存碎片,由于它的对象都是在数据段创建的。

    參考:Eliminating static initializers.


    工具类NonThreadSafe

    仅仅在Debug下有效。提供非线程安全对象的保护机制。即创建及使用在同一线程上。

    主要方法: CalledOnValidThread()

    RefCountedBase在最新 Chromium分支也是继承自NonThreadSafe。

     

    ThreadCollisionWarner

     (base/threading/thread_collision_warner.h)

    提供一组宏。用于帮助保证类的线程安全。这个源于线程问题预防的机制,在编码层面防止线程问题。

    细节參考: "Threading mess"

    主要提供的机制包含:

    1. DFAKE_SCOPED_LOCK, 限制某个函数仅仅能在一个线程上运行。
    2. DFAKE_SCOPED_RECURSIVE_LOCK, 多个函数能够在同一线程上嵌套调用。
    3. DFAKE_SCOPED_LOCK_THREAD_LOCKED, 同一时候仅仅同意一个函数运行在同样的线程上。包含创建和释放应当在同一线程上。

     ThreadChecker
    (base/threading/thread_checker.h)

    对一个非线程安全的类。为了确保它的实例不会被跨线程进行操作,就能够使用一个ThreadChecker成员变量来进行保证。

    *仅仅在Debug模式下生效。


     ThreadRestrictions
    (base/threading/thread_restrictions.h)
    为每一个线程添加限制条件。

    如不同意堵塞I/O, 是否同意单例对象等。

      以单例为例。它会在base::Singleton::get()检查。

      而IO的检查,则在各个IO处理的函数中检查,如LoadNativeLibrary(), SysInfo::AmountOfFreeDiskSpace(), OpenFile()等。 
    FILE* OpenFile(const FilePath& filename, const char* mode) {
      ThreadRestrictions::AssertIOAllowed();
      …...
    }
     WatchDog
    (base/threading/watchdog.h)
    用于监測某个线程在指定时间没有响应的情况。主要方法Arm()及Disarm()。

    在UMA中:
    class ShutdownWatchDogThread : public base::Watchdog { 
    …...

    *C++11 thread尚未使用。

  • 相关阅读:
    密文搜索
    poj 1182 食物链
    1147. Heaps (30)
    1146. Topological Order (25)
    1145. Hashing
    1142. Maximal Clique (25)
    fzu 2112 tickets
    51nod 1554 欧姆诺姆和项链
    codeforces 963B Destruction of a Tree
    hdu 3294 Girls' research
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7246578.html
Copyright © 2011-2022 走看看