std::bind和boost::signals2一起使用安全吗?
Is it safe to use std::bind with boost::signals2?
使用std::bind传递成员函数给boost::signals2::signal::connect()是否安全?换句话说,boost::bind和std::bind可以互换吗?
它可以用vc++ 2010 SP1编译,但是模板代码超出了我的理解范围,我担心我可能会冒险进入未定义的行为领域。
我在这个主题上没有经验,我希望connect
采取任何实现有效函数调用操作符的东西。使用任何与签名匹配的函数或函数对象调用它都应该是安全的,无论是boost::bind、std::bind还是其他任何东西。Boost库被设计成通用的,所以它们通常不会去挑选彼此的实现细节。
connect
函数接受一个boost::function
对象,该对象基本上是对任何具有为其定义的operator()
的通用包装器。因此,它与您所绑定的内容一样安全。
例如:
boost::shared_ptr<ClassName> pValue = boost::make_shared<ClassName>(...);
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...);
这是相当安全的,因为它存储了一个boost::shared_ptr
作为其数据的一部分。
ClassName *pValue = new ClassName(...);
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...);
这是有条件安全的。如果该连接仍然存在并且您执行delete pValue
,则立即变得不安全。
就我个人而言,我不太相信"有条件安全",但这取决于你。关键是,绑定到boost::bind
的所有内容必须在绑定期间继续存在。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 通过网络、跨平台传递std::变体是否安全
- 在std::thread中,joinable()然后join()线程安全吗
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- 在c++队列中使用pop和visit实现线程安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 安全到标准:移动会员?
- AcquireCredentialsHandleA() 返回 PFX 文件的0x8009030e(安全包中没有可用的凭据
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- std::bind和boost::signals2一起使用安全吗?