Ice读书笔记--C++线程与并发(一)
2011-08-29 20:59
113 查看
C++线程与并发
1. Ice线程模型
Ice服务器是多线程的。服务器端run time维护有一个线程池,用于处理到来的请求。通过领导者-跟随者线程模型,客户发来的每个操作调用都会在其自己的线程中被分派。
多线程意味着,来自客户的多个调用可以在服务器中并发执行。Ice线程库提供了许多同步原语,比如简单互斥体,读写锁,以及监控器等;这些同步原语允许实现不同力度的并发控制。
2. 线程库综述
Ice线程库提供了一些与线程有关的抽象:互斥体;递归互斥体;读写递归互斥体;监控器;一个线程抽象,允许开发者创建、控制、销毁线程(线程API是IceUtil名字空间一部分)。
3. 互斥体
IceUtil::Mutex类(在IceUtil/Mutex.h中定义)和IceUtil::StaticMutex(在IceUtil/StaticMutex.h中定义)提供了简单的非递归互斥机制:
假设有一个文件类,名为Filesystem,他有一个read和write的操作函数(举例write):
要保证互斥锁的解锁,Mutex类含有两个助手类的类型定义Lock和TryLock:
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; }
相关文章推荐
- ICE笔记(08):C++线程与并发
- [并发并行]_[C/C++]_[C++标准库里的线程安全问题]
- C++并发实战:面试题6:线程一次性同步
- ICE笔记(08):C++线程与并发
- C++并发实战12:线程安全的queue
- c++并发探索1-线程基本管理
- [并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例]
- Ice笔记--C++线程与并发(小结)
- c++ 线程并发、任务队列、异步 任务封装和分发 lambda与任务 boost
- [并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例]
- Ice 线程与并发 C++
- ICE笔记(08):C++线程与并发
- c++线程并发:mutex,atomic,自旋锁spinlock,单线程
- Ice笔记--C++线程与并发(二)
- C++并发实战12:线程安全的queue
- 8 C++线程与并发
- C++中高并发使用线程不安全类库的一种方法
- Linux线程之线程池、高并发、线程数 C/C++ pthread 函数库
- 剑指offer-算法题练习:part14 c++多线程—2个线程并发售票系统-烽火众智
- Ice笔记--C++线程与并发(二)