gpt4 book ai didi

c++ - 同步此事件实现的最佳方式是什么

转载 作者:行者123 更新时间:2023-11-30 02:06:22 24 4
gpt4 key购买 nike

这是我尝试实现 C++ 事件。

class Event{
typedef std::tr1::function<void( int& )> CallbackFunction;
std::list< CallbackFunction > m_handlers;

template<class M>
void AddHandler(M& thisPtr, void typename (M::*callback)(int&))
{
CallbackFunction bound = std::tr1::bind(callback, &thisPtr, _1);
m_handlers.push_back(bound);
}

void operator()(int& eventArg)
{
iterate over list...
(*iter)(eventArg);

}}

这里的问题是线程安全。如果同时调用 AddHandleroperator(),事情可能会中断。

同步它的最佳方式是什么?使用互斥量可能会降低性能。我想知道在这种情况下 boost::signals 或 C# 事件的幕后发生了什么。

最佳答案

首先,在您以不够“快”为由排除任何实现可能性之前,您需要确定实际的性能要求是什么。您要每秒触发这些事件数千次吗?如果是,您是否真的需要一直向处理程序容器添加处理程序。

如果出于某种原因,这两个问题的答案实际上是"is",那么您可能需要研究无锁容器。这将意味着构建您自己的容器而不是能够使用 STL 列表。无锁容器将使用原子内在函数(例如 Windows 中的 InterlockedCompareExchange)来自动确定列表的末尾是否为 NULL。然后他们将使用类似的内在函数实际附加到列表中。如果多个线程同时尝试添加处理程序,则会出现额外的复杂情况。

然而,在多核机器和指令重新排序等世界中,这些方法可能充满危险。我个人使用的事件系统与您描述的没有什么不同,我将它与关键部分一起使用(至少在 Windows 中非常有效),并且我没有遇到性能问题。但另一方面,通过事件系统发送的任何内容都不会超过 20Hz 左右。

与任何与性能相关的问题一样,答案总是基于另一个问题的答案;您究竟在什么地方需要表现?

关于c++ - 同步此事件实现的最佳方式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8828427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com