Ice读书笔记--C++线程与并发(一)

C++线程与并发


1. Ice线程模型

Ice服务器是多线程的。服务器端run time维护有一个线程池,用于处理到来的请求。通过领导者-跟随者线程模型,客户发来的每个操作调用都会在其自己的线程中被分派。

多线程意味着,来自客户的多个调用可以在服务器中并发执行。Ice线程库提供了许多同步原语,比如简单互斥体,读写锁,以及监控器等;这些同步原语允许实现不同力度的并发控制。


2. 线程库综述

Ice线程库提供了一些与线程有关的抽象:互斥体;递归互斥体;读写递归互斥体;监控器;一个线程抽象,允许开发者创建、控制、销毁线程(线程API是IceUtil名字空间一部分)。


3. 互斥体

IceUtil::Mutex类(在IceUtil/Mutex.h中定义)和IceUtil::StaticMutex(在IceUtil/StaticMutex.h中定义)提供了简单的非递归互斥机制:

namespace IceUtil {
   class Mutex {
   public:
      Mutex();
      ~Mutex();
      void lock() const;
      bool tryLock() const;
      void unlock() const;
      typedef LockT<Mutex> Lock;
      typedef TryLockT<Mutex> TryLock;
   };
   struct StaticMutex {
      void lock() const;
      bool tryLock() const;
      void unlock() const;
      typedef LockT<StaticMutex> Lock;
      typedef TryLockT<StaticMutex> TryLock;
   };
}

假设有一个文件类,名为Filesystem,他有一个read和write的操作函数(举例write):

#include <IceUtil/Mutex.h>
// ...
namespace Filesystem {
// ...
   class FileI : virtual public File,virtual public Filesystem::NodeI {
   public:
   // As before...
   private:
      Lines _lines;
      IceUtil::Mutex _fileMutex;
   };
// ...
}
Filesystem::Lines;

void Filesystem::FileI::write(const Filesystem::Lines & text,
const Ice::Current &)
{
    _lines = text; // Not thread safe!
}
那么加入线程机制后:

void Filesystem::FileI::write(const Filesystem::Lines & text,
const Ice::Current &)
{
    _fileMutex.lock();
    _lines = text;
    _fileMutex.unlock();
}
但是使用这样的lock和unlock操作有一个固定的问题:如果在程序中漏写unlock操作,或者程序在unlock操作完成之前就已经返回,就会出现死锁的情况。

要保证互斥锁的解锁,Mutex类含有两个助手类的类型定义Lock和TryLock:

namespace IceUtil {
   class Mutex {
   // ...
      typedef LockT<Mutex> Lock;
      typedef TryLockT<Mutex> TryLock;
   };
}
LockT 和TryLockT 是简单的模板,主要由构造器和析构器组成; 构造器针对它的参数调用lock,而析构器调用unlock。现在重写write函数:

void Filesystem::FileI::write(const Filesystem::Lines & text,
const Ice::Current &)
{
   IceUtil::Mutex::Lock lock(_fileMutex); 
   _lines = text;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值