消息队列 线程

本文探讨了消息队列在数据处理中的应用,强调了类型限制和读取策略。同时,介绍了线程的概念以及相关API如pthread_create()、pthread_exit()和pthread_join()。在多线程环境下,由于并发访问可能导致的问题,提出了加锁或PV操作的解决方案。通过实例展示了线程同步的重要性。

消息队列

添加消息时,类型必须大与0;读取的时候 参数 0 表示读取所有的类型数据

结构体可以自定,数据类型也可以自定,但第一个参数必须是长整形long

执行多次写入,数据都会存入消息队列。读操作可以通过不同的参数来读取对应类型的数据,参数0可以读取所有类型的数据。

线程

进程:一个正在运行的程序                                    资源分配的基本单位

线程:进程内部的一条执行路径(序列)              调度和执行的基本单位

pthread_create() 创建线程

pthread_exit() 退出线程

pthread_join() 等待线程结束,合并线程

多线程并行操作,可能会出现问题

 运行结果 <= 5000;

问题在于多个线程可能同意时间进行了访问修改。这里就要进行加锁或pv操作来避免

 

 

### 三级标题:C++ 线程间通信中使用消息队列的实现方式 在 C++ 多线程编程中,消息队列是一种常用的线程间通信机制,它通过提供一个线程安全的队列结构,使得多个线程可以安全地进行数据交换。为了实现线程间的消息队列通信,通常需要结合互斥锁(`std::mutex`)、条件变量(`std::condition_variable`)以及队列容器(如 `std::queue`)等组件来构建一个线程安全的队列类 [^3]。 #### 1. 线程安全队列类的设计 一个基本的线程安全队列类可以通过继承一个公共基类(如 `QueueObject`)来实现,该类封装了互斥锁、条件变量以及队列操作的基本控制逻辑。此类设计可以支持后续的线程池、异步任务队列等复杂结构的构建 [^3]。 ```cpp #include <queue> #include <mutex> #include <condition_variable> #include <atomic> class ThreadSafeQueue { public: ThreadSafeQueue(size_t capacity = 100) : m_capacity(capacity), m_stop(false) {} void push(int value) { std::unique_lock<std::mutex> lock(m_mutex); m_cond_not_full.wait(lock, [this] { return m_queue.size() < m_capacity || m_stop; }); if (m_stop) return; m_queue.push(value); m_cond_not_empty.notify_one(); } int pop() { std::unique_lock<std::mutex> lock(m_mutex); m_cond_not_empty.wait(lock, [this] { return !m_queue.empty() || m_stop; }); if (m_stop && m_queue.empty()) return -1; // 返回错误码 int value = m_queue.front(); m_queue.pop(); m_cond_not_full.notify_one(); return value; } void stop() { m_stop.store(true); m_cond_not_empty.notify_all(); m_cond_not_full.notify_all(); } private: std::queue<int> m_queue; std::mutex m_mutex; std::condition_variable m_cond_not_empty; std::condition_variable m_cond_not_full; size_t m_capacity; std::atomic<bool> m_stop; }; ``` 该类支持线程安全的 `push` 和 `pop` 操作,并在队列满或为空时自动阻塞等待。此外,通过 `stop()` 方法可以通知所有等待线程退出,确保线程安全关闭 。 #### 2. 使用消息队列进行线程间通信 在实际使用中,可以创建多个生产者线程和消费者线程,分别调用 `push` 和 `pop` 方法进行数据交换。以下是一个简单的示例: ```cpp #include <iostream> #include <thread> #include <vector> void producer(ThreadSafeQueue& queue) { for (int i = 0; i < 10; ++i) { queue.push(i); std::cout << "Produced: " << i << std::endl; } } void consumer(ThreadSafeQueue& queue) { for (int i = 0; i < 10; ++i) { int value = queue.pop(); if (value != -1) std::cout << "Consumed: " << value << std::endl; } } int main() { ThreadSafeQueue queue; std::thread prod(producer, std::ref(queue)); std::thread cons(consumer, std::ref(queue)); prod.join(); cons.join(); queue.stop(); return 0; } ``` 该示例展示了两个线程之间的通信方式:生产者线程向队列中放入数据,消费者线程从队列中取出数据并处理,整个过程由互斥锁和条件变量保障线程安全 [^3]。 #### 3. 消息队列的优势与适用场景 消息队列通信方式的优势在于其解耦性、异步性和可扩展性。它适用于需要多个线程之间进行数据交换、任务调度、事件通知等场景,尤其适合构建线程池、异步日志系统、事件驱动架构等复杂系统 [^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值