google base之LockImpl

为了兼容不同的平台,这个类采用了impl模式,win平台通过CRITICAL_SECTION, 这样的话还是相对比较简单,具体就不详解了,不过不得不说boost的实现方式就要复杂到哪里去了,当然,好处就是功能强大,坏处就是学习成本高,会用的人少。

#if defined(OS_WIN)
#include <windows.h>
#elif defined(OS_POSIX)
#include <pthread.h>
#endif

#include "base/base_export.h"
#include "base/basictypes.h"

namespace base {
namespace internal {

// This class implements the underlying platform-specific spin-lock mechanism
// used for the Lock class.  Most users should not use LockImpl directly, but
// should instead use Lock.
class BASE_EXPORT LockImpl {
 public:
#if defined(OS_WIN)
  typedef CRITICAL_SECTION NativeHandle;
#elif defined(OS_POSIX)
  typedef pthread_mutex_t NativeHandle;
#endif

  LockImpl();
  ~LockImpl();

  // If the lock is not held, take it and return true.  If the lock is already
  // held by something else, immediately return false.
  bool Try();

  // Take the lock, blocking until it is available if necessary.
  void Lock();

  // Release the lock.  This must only be called by the lock‘s holder: after
  // a successful call to Try, or a call to Lock.
  void Unlock();

  // Return the native underlying lock.
  // TODO(awalker): refactor lock and condition variables so that this is
  // unnecessary.
  NativeHandle* native_handle() { return &native_handle_; }

 private:
  NativeHandle native_handle_;

  DISALLOW_COPY_AND_ASSIGN(LockImpl);
};

}  // namespace internal
}  // namespace base

#endif  // BASE_SYNCHRONIZATION_LOCK_IMPL_H_

  

时间: 2024-10-25 02:13:05

google base之LockImpl的相关文章

google base库之simplethread

// This is the base SimpleThread. You can derive from it and implement the // virtual Run method, or you can use the DelegateSimpleThread interface. class BASE_EXPORT SimpleThread : public PlatformThread::Delegate { public: class BASE_EXPORT Options

google base库中的WaitableEvent

这个类说白了就是对windows event的封装,没有什么特别的,常规做法,等侍另一线程无非就是等侍事件置信waitsingleobject,通知事件无非就是setevent,一看就明白,不就详解,写在这里只是为了这个系更的完整性 下边的示例代码注意下: // WaitableEvent *e = new WaitableEvent; // SendToOtherThread(e); // e->Wait(); // delete e;  SendToOtherThread(e); 这个应当就

google base之IncomingTaskQueue

如同名称描述的那样,这个类就是个taskqueue,也就是任务队列,添加任务到队列,然后由MessageLoop去执行task,比较关心的函数如下: bool IncomingTaskQueue::AddToIncomingQueue( const tracked_objects::Location& from_here, const Closure& task, TimeDelta delay, bool nestable) { AutoLock locked(incoming_queu

google base 之MessagePumpForUI

base库中比较有意思就是这个类了,如同很多界面库一样,创建了一个隐藏窗口来处理需要在界面线程处理的消息,大体原理也就是需要执行task的时候发送一个自定义的消息,当窗口接收到task的时候调用保存起来的回调函数,还有的是通过把回调放在消息结构体里面 自下义的消息 // Message sent to get an additional time slice for pumping (processing) another // task (a series of such messages c

爬虫:Scrapy5 - 选择器Selectors

当抓取网页时,常见的任务是从HTML源码中提取数据.现有的一些库可以达到这个目的: BeautifulSoup lxml Scrapy 提取数据有自己的一套机制.它们被称作选择器(seletors),因为他们通过特定的 XPath 或者 CSS 表达式来"选择" HTML 文件中的某个部分. 构造选择器 Scrapy selector 是以 文字(Text)或 TextResponse 构造的 Selector.其根据输入类型自动选择最优的分析方法(XML vs HTML): >

windows平台下和跨平台的相关公共库

以下主要包含windows下公共库以及跨平台公共库: 1. google base库:google下chromium项目的跨平台公共库: 2. vc_common_src:即HP_SOCKET项目中的公共库: 3. dlib:跨平台公共库,比较综合的各种库: 4. stlsoft:包含windows和linux下封装的工具库,如文件.资源.句柄.指针等:

各类搜索引擎

1.搜索引擎 首先想到谁了呢?aha,google first!再baidu 一下.不过你得先自己把下面搜索引擎搜遍再求我哦     http://google.com    http://baidu.com    http://search.msn.com/    http://www.jux2.com/    http://comparesearchengines.dogpile.com/    http://instant.search.yahoo.com/    http://searc

改进Threadglog并增加多线程写测试

写了个objectpool,很简单,就是个线程安全的队列. #pragma once #include <iostream> #include <concurrent_vector.h> #include <concurrent_queue.h> #include <algorithm> template <typename T> class ObjectPool { public: ObjectPool(size_t chunk_size =

glog另启动线程写文本日志

glog本身是非常高效的,google的大牛肯定知道大规模的写日志用glog的话肯定会影响业务线程的处理,带负荷的磁盘IO谁都桑不起.比如levelDB就是默认异步写,更不用说google的三驾马车都是分布式的.之前看过其论文,简直是引领时代. 在glog的issue里有人提出了异步写的问题,但是语焉不详,不过0.33版本已经有了接口,但是还不友好,但是完全可以实现磁盘日志的异步写. 今天算是花了点时间踩了点坑,算是基本可以搞了.稳定之后会把这个版本和glog,g2log,mudo loggin