ICE实现线程安全之互斥

本文介绍了ICE服务器的多线程模型,强调了在并发执行的操作中,对共享数据结构如servant成员变量进行互锁的重要性。通过示例展示了如何使用IceUtil::Mutex实现线程安全的read和write操作,以防止数据损坏。确保在并发访问时,通过互斥体对_lines成员的访问进行序列化。
如果在一个线程读取某个数据结构的同时,另一个线程正在更新同一个数据结构,
除非你用适当的锁保护这个数据结构,否则就会发生严重的混乱。



线程模型
Ice服务器天生是多线程的。服务器端run time维护有一个线程池,用于处理到来的请求。
通过领导者-跟随者(leader-follower)线程模型,
客户发来的每个操作调用都会在其自己的线程中被分派。在服务器中,如果所有线程都在执行操作调用,耗尽了线程池,随后到来的客户请
求就会“透明地”延迟处理,直到服务器中的某个操作完成、放弃其线程;这个线程随即被用于分派下一个待处理的客户请求。
通过Ice.ThreadPool.Server.Size属性,可以配置服务器中的线程池的尺寸。

多线程意味着,来自客户的多个调用可以在服务器中并发执行。事实上,在同一个
servant中,以及在同一servant的同一个操作中,都可以有多个请求在并行执行。因此,如果在操作实现中,涉及到对非栈存储的操纵
(比如servant的成员变量、全局变量,或静态变量),你必须对数据访问进行互锁,以防止数据损坏。


//不要从同一个线程多次针对同一个互斥体调用
namespace IceUtil {//简单的非递归互斥机制
    class Mutex {
    public:
        Mutex();
        ~Mutex();
        void lock() const;
        bool tryLock() const;
        void unlock() const;
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值