如果在一个线程读取某个数据结构的同时,另一个线程正在更新同一个数据结构,
除非你用适当的锁保护这个数据结构,否则就会发生严重的混乱。
线程模型
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;
除非你用适当的锁保护这个数据结构,否则就会发生严重的混乱。
线程模型
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;

本文介绍了ICE服务器的多线程模型,强调了在并发执行的操作中,对共享数据结构如servant成员变量进行互锁的重要性。通过示例展示了如何使用IceUtil::Mutex实现线程安全的read和write操作,以防止数据损坏。确保在并发访问时,通过互斥体对_lines成员的访问进行序列化。
最低0.47元/天 解锁文章
611

被折叠的 条评论
为什么被折叠?



