`

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

    博客分类:
  • ACE
阅读更多

 

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

ACE Condition类属


ACE Condition类属(条件变量)提供风格与互斥体、读者/作者锁和计数信号量不同的锁定机制。当持有锁的线程在临界区执行代码时,这三种机制让协作线程进行等待。相反,条件变量通常被一个线程用于使自己等待,直到一个涉及共享数据的条件表达式到达特定的状态。当另外的协作线程指示共享数据的状态已发生变化,调度器就唤醒一个在该条件变量上挂起的线程。于是新唤醒的线程重新对它的条件表达式进行求值,如果共享数据已到达合适状态,就恢复处理。


ACE线程库提供一个叫作Condition的类来可移植地在C++包装类中实现条件变量语义。定义方式如下: 

ACE_Thread_Mutex mutex; 

ACE_Condition<ACE_Thread_Mutex> cond(mutex);


该对象有两个常用方法。


signal()

向使用该条件变量的其它线程发送满足条件信号。

wait()

查询是否满足条件,如果满足,则继续往下执行;如果不满足条件,主线程就等待在此条件变量上。条件变量随即自动释放互斥体,并使主线程进入睡眠。

条件变量总是与互斥体一起使用。这是一种可如下描述的一般模式:


while( expression NOT TRUE ) wait on condition variable;


条件变量不是用于互斥,往往用于线程间的协作,下面例子演示了通过条件变量实现线程协作。

#include "ace/Thread.h" 
#include "ace/Synch.h" 

#include <iostream>
using namespace std;

ACE_Thread_Mutex mutex;
ACE_Condition<ACE_Thread_Mutex> cond(mutex);

void* worker(void *arg) 
{
    ACE_OS::sleep(2);        //保证eater线程的cond.wait()在worker线程的cond.signal()先执行
    mutex.acquire();
    ACE_OS::sleep(1);
    cout<<endl<<"produce"<<endl;
    cond.signal();
    mutex.release();
    return NULL; 
}

void* eater(void *arg) 
{
    mutex.acquire();
    cond.wait();
    cout<<endl<<"eat"<<endl;
    mutex.release();
    return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
    ACE_Thread::spawn((ACE_THR_FUNC)worker);
    ACE_OS::sleep(1);
    ACE_Thread::spawn((ACE_THR_FUNC)eater);

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

    return 0; 
}
 

 

这个例子中,首先创建了一个生产者线程worker和一个消费者线程eater,消费者线程执行比生产者快,两个线程不加限制并发执行会导致先消费,后生产的情况(只是加互斥锁也不能很好的解决,以为无法保证生产者一定先获得互斥体)。所以这里通过条件变量的通知方式保证线程的顺序执行:


消费者线程获取互斥体,等待条件满足(生产者生产了食品)。同时释放互斥体,进入休眠状态。

生产者获取互斥体(虽然是消费者先获取的互斥体,但消费者调用的wait函数会释放消费者的互斥体),生产商品后,通过条件变量发送信号(调用signal函数)通知消费者生产完成,结束生产过程,释放互斥体。

消费者收到信号后,重新获取互斥体,完成消费过程。

     


使用条件变量的注意事项:


条件变量必须和互斥体一起使用,也就是说使用前必须加锁(调用互斥体acquire函数),使用完后需释放互斥体。

条件变量中的wait()和signal()成对使用的话,必须保证wait()函数在signal()之前执行,这样才能保证wait()能收到条件满足通知,不至于一直等待下去,形成死锁(worker线程中的第一句话就是起的这个作用)。

分享到:
评论

相关推荐

    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 - 例子学习

    3. **线程与并发**:ACE提供了强大的线程管理功能,包括线程创建、同步、互斥、条件变量等。示例可能会展示如何使用ACE_Guard和ACE_Mutex来实现线程安全。 4. **I/O复用**:ACE_Win32_Acceptor和ACE_SOCK_Acceptor...

    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多线程服务器C++实现

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

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

    3. **事件循环**:ACE的事件循环机制处理来自多个源的并发事件,如网络连接、定时器和信号,确保程序可以及时响应。 4. **服务配置**:ACE允许动态加载和卸载服务,这在构建可扩展和灵活的分布式系统时特别有用。 ...

    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