`

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

    博客分类:
  • ACE
阅读更多

ACE Lock类属

锁类属包含的类包装简单的锁定机制,比如互斥体、信号量、读/写互斥体和令牌等。这里我就以互斥体为例简单的介绍一下其使用方法,对其它的锁类进行一些简单的说明。

1.互斥体的使用。

互斥体用于保护共享的易变代码,也就是全局或静态数据。这样的数据必须通过互斥体进行保护,以防止它们在多个线程同时访问时损坏。

在ACE中可以通过ACE_Thread_Mutex实现线程的访问互斥,下面的例子演示ACE_Thread_Mutex类的使用。

 

#include "ace/Thread.h" 
#include "ace/Synch.h" 
#include <iostream>
using namespace std;

ACE_Thread_Mutex mutex;

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

	return NULL; 
} 

void* Thread2(void *arg) 
{
	mutex.acquire();
	cout<<endl<<"hello thread2"<<endl;
	mutex.release();

	return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
	ACE_Thread::spawn((ACE_THR_FUNC)Thread1);

	//Thread2 比Thread1晚创建1秒钟,故后尝试获取互斥体
	ACE_OS::sleep(1);
	ACE_Thread::spawn((ACE_THR_FUNC)Thread2);

	while(true)
		ACE_OS::sleep(10);

	return 0; 
}
 

 

ACE_Thread_Mutex主要有两个方法:

  1. acquire():用来获取互斥体,如果无法获取,将阻塞至获取到为止。
  2. release():用来释放互斥体,从而使自己或者其它线程能够获取互斥体。

当线程要访问共享资源时,首先调用acquire()方法获取互斥体,从而获取对改互斥体所保护的共享资源的唯一访问权限,访问结束时调用释放互斥体,使得其它线程能获取共享资源的访问权限。

在此例中,本来Thread2的打印消息在Thread1之前,但由于Thread1先获得互斥体,故Thread2只有待Thread1结束后才能进入临界区。读者朋友们可以通过将ACE_Thread_Mutex替换为ACE_NULL_Mutex看一下不加锁的执行结果。

2.ACE Lock类属简介。

ACE Lock类属列表如下:

名字

描述

ACE_Mutex

封装互斥机制(根据平台,可以是mutex_t、pthread_mutex_t等等)的包装类,用于提供简单而有效的机制来使对共享资源的访问序列化。它与二元信号量(binary semaphore)的功能相类似。可被用于线程和进程间的互斥。

ACE_Thread_Mutex

可用于替换ACE_Mutex,专用于线程同步。

ACE_Process_Mutex

可用于替换ACE_Mutex,专用于进程同步。

ACE_NULL_Mutex

提供了ACE_Mutex接口的"无为"(do-nothing)实现,可在不需要同步时用作替换。

ACE_RW_Mutex

封装读者/作者锁的包装类。它们是分别为读和写进行获取的锁,在没有作者在写的时候,多个读者可以同时进行读取。

ACE_RW_Thread_Mutex

可用于替换ACE_RW_Mutex,专用于线程同步。

ACE_RW_Process_Mutex

可用于替换ACE_RW_Mutex,专用于进程同步。

ACE_Semaphore

这些类实现计数信号量,在有固定数量的线程可以同时访问一个资源时很有用。在OS不提供这种同步机制的情况下,可通过互斥体来进行模拟。

ACE_Thread_Semaphore

应被用于替换ACE_Semaphore,专用于线程同步。

ACE_Process_Semaphore

应被用于替换ACE_Semaphore,专用于进程同步。

ACE_Token

提供"递归互斥体"(recursive mutex),也就是,当前持有某令牌的线程可以多次重新获取它,而不会阻塞。而且,当令牌被释放时,它确保下一个正阻塞并等待此令牌的线程就是下一个被放行的线程。

ACE_Null_Token

令牌接口的"无为"(do-nothing)实现,在你知道不会出现多个线程时使用。

ACE_Lock

定义锁定接口的接口类。一个纯虚类,如果使用的话,必须承受虚函数调用开销。

ACE_Lock_Adapter

基于模板的适配器,允许将前面提到的任意一种锁定机制适配到ACE_Lock接口。

可以简单的分为以下几类:

  1. 互斥锁
    互斥锁(通常称为"互斥体"或"二元信号量")用于保护多线程控制并发访问的共享资源的完整性。互斥体通过定义临界区来序列化多线程控制的执行,在临界区中每一时刻只有一个线程在执行它的代码。互斥体简单而高效(时间和空间)。
    ACE线程库提供了Mutex式的类(是一组互斥体对象,拥有类似的接口),他是一种简单而高效的类型是"非递归"互斥体。
    非递归互斥体不允许当前拥有互斥体的线程在释放它之前重新获取它。否则,将会立即发生死锁。递归互斥体在ACE Recursive_Thread_Mutex类中可移植地实现。
  2. 读者/作者锁
    读者/作者锁与互斥体相类似。例如,获取读者/作者锁的线程也必须释放它。多个线程可同时获取一个读者/作者锁用于读,但只有一个线程可以获取该锁用于写。当互斥体保护的资源用于读远比用于写要频繁时,读者/作者互斥体有助于改善并发的执行。
    ACE线程库提供了一个叫作RW_Mutex的类,在C++封装类中可移植地实现了读者/作者锁的语义。
    读者/作者锁将优先选择权给作者。因而,如果有多个读者和一个作者在锁上等待,作者将会首先获取它。

计数信号量
在概念上,计数信号量是可以原子地增减的整数。如果线程试图减少一个值为零的信号量的值,它就会阻塞,直到另一个线程增加该信号量的值。
计数信号量用于追踪共享程序状态的变化。它们记录某种特定事件的发生。因为信号量维护状态,它们允许线程根据该状态来作决定,即使事件是发生在过去。
信号量比互斥体效率要低,但是,它们要更为通用,因为它们无需被最初获取它们的同一线程获取和释放。这使得它们能够用于异步的执行上下文中(比如信号处理器)。ACE线程库提供一个叫作Semaphore的类来可移植地在C++包装类中实现信号量语义。

分享到:
评论

相关推荐

    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资料系列1 - 配置和入门

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

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

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

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

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

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

    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