本文主要是介绍C++ 基于STL标准库实现 ManualResetEvent、AutoResetEvent (手动重置事件,自动重置事件),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这两个同步对象的作用就不细说了,多核编程(多线程)算是 C/C++ 开发人员入门的基本功,在很多场景上面都需要用这些,做客户端的童鞋应该常用,但更多是用系统API来实现,但是不是那么通用,因为每个平台接口都不一样,用STL实现的可移植性要好很多。
简单说说:
ManualResetEvent 如果拥有信号,则所有线程都不等待,否则所有线程等待线程,类似读写锁的概念。
AutoResetEvent 如果拥有信号,则唤醒任意一个线程,其它线程继续等待,因为唤醒线程后会立即重置信号。
基于这两点的特性,用STL的condition_variable跟mutex库就可以轻松实现这两个功能了。
#pragma once#include <mutex>
#include <condition_variable>class ManualResetEvent {
private:std::mutex mtx;std::condition_variable cv;bool signaled;public:ManualResetEvent() : signaled(false) {}public:virtual void Set() {std::lock_guard<std::mutex> lock(mtx);signaled = true;cv.notify_all();}virtual void Reset() {std::lock_guard<std::mutex> lock(mtx);signaled = false;}virtual void Wait(bool reset = false) {std::unique_lock<std::mutex> lock(mtx);if (reset) {signaled = false;}cv.wait(lock, [this]() { return signaled; });}
};class AutoResetEvent {
private:std::mutex mtx;std::condition_variable cv;bool signaled;public:AutoResetEvent() : signaled(false) {}public:virtual void Set() {std::lock_guard<std::mutex> lock(mtx);signaled = true;cv.notify_one(); // 通知一个等待线程}virtual void Reset() {std::lock_guard<std::mutex> lock(mtx);signaled = false;}virtual void Wait() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [this]() { return signaled; }); // 等待事件被设置signaled = false; // 在 Wait 被唤醒后,立即将事件重置}
};
这篇关于C++ 基于STL标准库实现 ManualResetEvent、AutoResetEvent (手动重置事件,自动重置事件)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!