`

ACE线程管理机制-并发控制(2)

    博客分类:
  • ACE
阅读更多

ACE线程管理机制-并发控制(2)


与C一级的互斥体API相比较,Mutex包装为同步多线程控制提供了一种优雅的接口。但是,Mutex潜在地容易出错,因为程序员有可能忘记调用release方法(当然,C级的互斥体API更容易出错)。这可能由于程序员的疏忽或是C++异常的发生而发生,然而,其导致及其严重的后果--死锁。


因此,为改善应用的健壮性,ACE同步机制有效地利用C++类构造器和析构器的语义来确保Mutex锁被自动获取和释放。


ACE提供了一个称为Guard、Write_Guard和Read_Guard的类族,确保在进入和退出C++代码块时分别自动获取和释放锁。


Guard类是最基本的守卫机制,定义可以简化如下(实际定义比这相对要复杂而完善一点):

template <class LOCK>
class Guard
{
public:
    Guard (LOCK &l): lock_ (&l){ lock_.acquire (); }

    ˜Guard (void) {    lock_.release (); }
private:
    LOCK lock_;
}

Guard类的对象定义一"块"代码,在其上锁被自动获取,并在退出块时自动释放,即使是程序抛异常也能保证自动解锁。这种机制也能为Mutex、RW_Mutex和Semaphore同步封装工作。


对于读写锁,由于加锁接口不一样,ace也提供了相应的Read_Guard和Write_Guard类,Read_Guard和Write_Guard类有着与Guard类相同的接口。但是,它们的acquire方法分别对锁进行读和写。


缺省地, Guard类构造器将会阻塞程序,直到锁被获取。会有这样的情况,程序必须使用非阻塞的acquire调用(例如,防止死锁)。因此,可以传给ACE Guard的构造器第二个参数(请参看原始代码,而不是我这里的简化代码),指示它使用锁的try_acquire方法,而不是acquire。随后调用者可以使用Guard的locked方法来原子地测试实际上锁是否已被获取。


用Guard重写上一节的Thread1方法如下(注释了的部分是原有代码):

void* Thread1(void *arg) 
{
    ACE_Guard<ACE_Thread_Mutex> guard(mutex);
    //mutex.acquire();
    ACE_OS::sleep(3);
    cout<<endl<<"hello thread1"<<endl;
    //mutex.release();

    return NULL; 
}
 

相比较而言,使用Guard更加简洁,并且会自动解锁,免除了一部分后顾之忧。


注意:


Guard只能帮你自动加解锁,并不能解决死锁问题,特别是对于那些非递归的互斥体来说使用Guard尤其要注意防止死锁。

Guard是在Guard变量析构时解锁,如果在同一函数中两次对同一互斥体变量使用Guard要注意其对象生命周期,否则容易造成死锁。

分享到:
评论

相关推荐

    ACE学习应用实例-ACE线程

    ACE线程是ACE库中的核心功能之一,它提供了C++封装的线程管理接口。通过ACE_Thread类,开发者可以方便地创建、管理和同步线程。ACE线程支持线程局部存储(TLS),用于在线程间保持独立的数据,以及线程池管理,允许...

    ACE线程、锁、同步机制

    2. ACE_Thread_Manager:提供了一个线程管理机制,实现了对线程的创建、管理和同步。 3. ACE_Synch:提供了一个同步机制,实现了对线程之间的同步和互斥。 ACE线程封装库的应用场景包括: 1. 客户/服务器应用:ACE...

    ace 基础及其框架--个人整理版

    总的来说,ACE框架提供了丰富的网络编程、并发控制、线程管理、I/O复用等工具,对于开发者来说,它降低了开发复杂网络应用的难度,提高了代码的可移植性和可维护性。通过理解和掌握ACE框架,开发者可以更高效地构建...

    ACE资料系列2 - 例子学习

    ACE是一个开源库,提供了许多网络编程中常见的服务,如线程管理、同步机制、I/O复用、时间管理和事件处理等。它通过提供可移植的接口,简化了在不同操作系统上的开发工作。 2. **ACE架构**:ACE的核心设计理念是...

    ACE资料系列5 - ACE程序员指南 ACE程序员指南:网络与系统编程的实用设计模式

    4. **并发与线程管理**:ACE提供了高级的线程管理工具,如Thread Manager和Thread Pool,用于高效地调度和管理并发任务。这部分内容将解释如何使用这些工具来优化多线程程序的性能。 5. **时间管理和同步**:ACE...

    ACE资料系列1 - 配置和入门

    ACE的设计基于模块化,使得开发者可以按需选择和使用其提供的组件,例如TCP/IP套接字抽象、线程管理、定时器队列等。此外,ACE还支持许多高级通信模式,如反应器模式、服务容器和工作调度器,这些都有助于简化复杂...

    MFCACE多线程demo

    ACE线程管理包括线程创建、同步、线程池等。 - 使用`ACE_Thread_Manager`来管理线程生命周期。 - `ACE_Thread::spawn()`函数用于创建新线程。 - `ACE_Thread_Mutex`和`ACE_Semaphore`等类用于实现线程同步和互斥。 ...

    ace-radius-0.9.2

    ACE是一个强大的、开源的、跨平台的C++框架,它提供了一整套网络编程的抽象和实用工具,包括并发处理、线程管理、I/O复用、对象间通信以及时间管理和事件调度等。利用ACE,开发者可以轻松地构建分布式、高可用性和高...

    ACE 服务器源码,高并发的高性能处理器和源码

    这个压缩包包含的文件主要是ACE服务器的源码及相关组件,可以帮助我们深入理解ACE的工作机制以及如何构建高性能的并发服务器。 1. **ACE 框架** ACE 是一个C++库,它提供了许多高级网络通信机制,如事件处理、异步...

    ACE-radius

    - ACE-radius将Radius协议的逻辑封装在ACE库中,利用ACE的异步I/O和多线程能力,可以高效地处理并发认证请求。 - ACE的跨平台特性意味着ACE-radius可以在多种操作系统上运行,如Windows、Linux、Unix等。 5. **...

    ACE资料系列4 - C++网络编程 卷2 基于ACE和框架的系统化复用 +PPT

    5. **对象激活和生命周期管理**:ACE提供了对对象创建、激活、暂停、恢复和终止的控制,有助于实现复杂系统的生命周期管理。 **PPT资料的价值** 与《C++网络编程 卷2》配套的PPT资料,通常会包含深入的示例、图形...

    ACE多线程服务器C++实现

    - 主函数:初始化服务器,设置监听端口,创建线程管理器。 - `ACE_SOCK_Acceptor`的实例化:用于接收客户端连接。 - 自定义的服务处理类:继承自`ACE_Service_Object`,实现业务逻辑。 - 线程创建:当有新的客户端...

    ACE 框架模版

    5. **并发与线程**:ACE 提供了线程管理和同步原语,帮助开发者在多线程环境中编写高效、安全的代码。 6. **性能优化**:针对实时系统,ACE 内置了各种性能优化策略,如缓冲池、预读取、延迟写等,提高系统的响应...

    ACE源码_ACE+TAO-6.3.0.tar.gz

    2. **并发与线程管理**:ACE提供了线程池、守护线程、线程同步和互斥锁等机制,简化了多线程编程。 3. **事件驱动模型**:ACE的Reactor模式实现了事件驱动编程,允许应用程序处理多个并发事件,提高了系统响应速度。...

    ACE-5.4.zip ACE5.4源码

    ACE5.4是该框架的一个版本,提供了丰富的网络编程接口和工具,支持多种协议,包括TCP/IP、UDP、Sockets等,并且具有线程管理和并发控制等功能。 ACE框架的核心特点包括: 1. **跨平台兼容性**:ACE可以在多个操作...

    ACE并发编程示例及Task类的实现

    在《ACE并发编程.docx》文档中,你可以找到关于如何创建和使用ACE_Task的详细步骤,包括初始化、消息处理、线程管理和销毁等过程。《ACE_Task类讲解.docx》则可能进一步深入到类的成员函数、接口以及实际应用示例,...

    ACE-5.4.10源码

    1. **并发与线程管理**:ACE提供了一套全面的线程管理API,包括线程创建、同步、互斥锁、条件变量等功能,使得开发者能轻松处理多线程编程中的复杂问题。 2. **异步事件处理**:ACE的Reactor模式是处理异步事件的...

    ACE-Message-Block.rar_ACE

    总结来说,`ACE_Message_Block`是ACE库中处理数据传输和并发通信的核心组件,它的设计和实现充分考虑了性能和内存管理,为开发高效、可靠的网络应用提供了强大支持。通过学习和熟练掌握`ACE_Message_Block`,开发者...

Global site tag (gtag.js) - Google Analytics