acl/lib_fiber/cpp/include/fiber/fiber_event.hpp
2021-08-23 18:41:23 +08:00

66 lines
1.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "fiber_cpp_define.hpp"
struct ACL_FIBER_EVENT;
namespace acl {
/**
* 可用于协程之间、线程之间以及协程与线程之间,通过事件等待/通知方式进行同步的
* 的事件混合锁
*/
class FIBER_CPP_API fiber_event
{
public:
/**
* 构造方法
* @param use_mutex {bool} 在用在多线程之间进行事件同步时,如果启动的
* 的线程数较多(成百上千个线程),则此标志应设为 true 以便于内部在
* 同步内部对象时使用线程互斥锁进行保护,以避免形成惊群现象,如果启动
* 的线程数较多但该标志为 false则内部使用原子数进行同步保护很容易
* 造成惊群问题;当启动的线程数较(几十个左右),则此参数可以设为 false
* 以告之内部使用原子数进行同步保护
* @param fatal_on_error {bool} 内部发生错误时是否直接崩溃,以便于开发
* 人员进行错误调试
*/
fiber_event(bool use_mutex = true, bool fatal_on_error = true);
~fiber_event(void);
/**
* 等待事件锁
* @return {bool} 返回 true 表示加锁成功,否则表示内部出错
*/
bool wait(void);
/**
* 尝试等待事件锁
* @return {bool} 返回 true 表示加锁成功,否则表示锁正在被占用
*/
bool trywait(void);
/**
* 事件锁拥有者释放事件锁并通知等待者
* @return {bool} 返回 true 表示通知成功,否则表示内部出错
*/
bool notify(void);
public:
/**
* 返回 C 版本的事件对象
* @return {ACL_FIBER_EVENT*}
*/
ACL_FIBER_EVENT* get_event(void) const
{
return event_;
}
private:
ACL_FIBER_EVENT* event_;
fiber_event(const fiber_event&);
void operator=(const fiber_event&);
};
} // namespace acl