webrtc的锁,便于后记

本文介绍了WebRTC中互斥锁的实现,包括跨平台的CriticalSection类,资源管理类CritScope确保锁的自动释放,防止异常情况下资源泄露。同时提到了禁用拷贝和赋值的宏,以及AtomicOps类在原子操作中的应用。
摘要由CSDN通过智能技术生成

今天想抓点什么优秀的代码,但是文件之间依赖性太大了,很难抽,看来看去,找到了一个地方。

锁的使用:

1,多线程访问同一个变量,需要加锁。

2,锁是一种资源,需要做好加锁和解锁相对应,创建和释放相对应。


下面是锁的代码:



#ifndef TALK_BASE_CRITICALSECTION_H__
#define TALK_BASE_CRITICALSECTION_H__


#include "talk/base/constructormagic.h"


#ifdef WIN32
//#include "talk/base/win32.h"
#include <Windows.h>
#endif


#ifdef POSIX
#include <pthread.h>
#endif


#ifdef _DEBUG
#define CS_TRACK_OWNER 1
#endif  // _DEBUG


#if CS_TRACK_OWNER
#define TRACK_OWNER(x) x
#else  // !CS_TRACK_OWNER
#define TRACK_OWNER(x)
#endif  // !CS_TRACK_OWNER


namespace talk_base {


#ifdef WIN32
class CriticalSection {
 public:
  CriticalSection() {
    InitializeCriticalSection(&crit_);
    // Windows docs say 0 is not a valid thread id
    TRACK_OWNER(thread_ = 0);
  }
  ~CriticalSection() {
    DeleteCriticalSection(&crit_);
  }
  void Enter() {
    EnterCriticalSection(&crit_);
    TRACK_OWNER(thread_ = GetCurrentThreadId());
  }
  bool TryEnter() {
    if (TryEnterCriticalSection(&crit_) != FALSE) {
      TRACK_OWNER(thread_ = GetCurrentThreadId());
      return true;
    }
    return false;
  }
  void Leave() {
    TRACK_OWNER(thread_ = 0);
    LeaveCriticalSection(&crit_);
  }


#if CS_TRACK_OWNER
  bool CurrentThreadIsOwner() const { return thread_ ==

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值