ICE_线程与并发操作
ICE 本身就是一个多线程平台,必须注意临界数据的保护问题。
服务器端run time 维护有一个线程池,用于处理到来的请求。通过领导者- 跟随者线程模型,
客户发来的每个操作调用都会在其自己的线程中被分派。在服务器中,如果所有线程都在
执行操作调用,耗尽了线程池,随后到来的客户请求就会“透明地”延迟处理,直到服务
器中的某个操作完成、放弃其线程;这个线程随即被用于分派下一个待处理的客户请求。
通过Ice.ThreadPool.Server.Size 属性,可以配置 服务器中的线程池的尺寸。这个属性的缺
省值是1。
Ice 线程库提供了这样一些与线程有关的抽象:
• 互斥体
• 递归互斥体
• 读写递归互斥体
• 监控器
• 一个线程抽象,允许你创建、控制、销毁线程。
所有的线程API 都是IceUtil 名字空间的一部分。
互斥体
IceUtil::Mutex
IceUtil::StaticMutex
static IceUtil::StaticMutex myStaticMutex =ICE_STATIC_MUTEX_INITIALIZER;
• lock
lock 函数尝试获取互斥体。如果互斥体已经锁住,它就会挂起发出调用的线程(calling
thread),直到互斥体变得可用为止。一旦发出调用的线程获得了互斥体,调用就会立即返
回。
• tryLock
tryLock 函数尝试获取互斥体。如果互斥体可用,互斥体就会锁住,而调用就会返回true。
如果其他线程锁住了互斥体,调用返回false。
• unlock
unlock 函数解除互斥体的加锁。请注意, IceUtil::Mutex 和IceUtil::StaticMutex 是非递归
的互斥体实现。这意味着,你必须遵守以下规则:
• 不要从同一个线程多次针对同一个互斥体调用lock。这些互斥体不是递归的,所以,如果
互斥体的所有者试图第二次锁住它,其行为将是不确定的。
• 除非发出调用的线程持有某个互斥体,否则不要针对该互斥体调用unlock。如果目前没有
线程持有某个互斥体,或者持有它的是另外的线程,针对它调用unlock 就会导致不确定的
行为。
递归互斥体
namespace IceUtil {
class RecMutex {