C++ 添加使用malloc()并具有状态的TensorFlow Op

C++ 添加使用malloc()并具有状态的TensorFlow Op,c++,tensorflow,C++,Tensorflow,我编写了一个TensorFlow Op,它封装了一个用C编写的库,该库在内部调用malloc(),以分配缓冲区并保持状态。我在构造函数中初始化库,在这里调用malloc(),然后在Compute()中使用互斥保护。析构函数对free()进行适当的调用 在我的模型中,每个线程都在同一个图中创建Op的副本,并在共享会话中运行它。代码经常因指针相关问题而崩溃,例如“释放对象的校验和不正确-对象可能在释放后被修改”。我为Op编写的单线程单元测试运行良好 我怀疑图形优化器可能正在重新使用Op的单个实例,或

我编写了一个TensorFlow Op,它封装了一个用C编写的库,该库在内部调用
malloc()
,以分配缓冲区并保持状态。我在构造函数中初始化库,在这里调用
malloc()
,然后在
Compute()
中使用互斥保护。析构函数对
free()
进行适当的调用

在我的模型中,每个线程都在同一个图中创建Op的副本,并在共享会话中运行它。代码经常因指针相关问题而崩溃,例如“释放对象的校验和不正确-对象可能在释放后被修改”。我为Op编写的单线程单元测试运行良好

我怀疑图形优化器可能正在重新使用Op的单个实例,或者类似的东西。有没有办法告诉它Op是有状态的,应该保持原样?坠机还有其他可能的原因吗

我正在运行TensorFlow 1.0.0,并在OSX 10.10下使用clang 7.0编译Op。将C文件首先编译成一个共享对象,然后将C++文件与共享对象一起编译.< /p>

,关于“添加新的OP”:

重要提示:可以同时访问操作内核的实例。您的计算方法必须是线程安全的。使用互斥锁保护对类成员的任何访问。或者更好的是,不要通过类成员共享状态!考虑使用A来跟踪OP状态。


不幸的是,截至撰写此答案时,ResourceMgr的使用还很粗略。

如果最简单的解决方案是修复库本身,那么我应该使用什么来代替malloc/free?您是否考虑过运行和/或在代码上运行?若否,;你应该。跑一圈和/或可能也不会受伤。。。在编译器中启用所有警告也不会有什么坏处。没有人说你不应该在C库中使用malloc/free。诀窍是正确地使用它们;-)。但是,在C++库中,有更好的选项,比如析构函数和智能指针。是的,公共子表达式消除器会引起问题。使用
.setisstatef
。我在记忆中做这件事,比如@YaroslavBulatov这太棒了,谢谢!我知道它必须存在,因为
py_func()
可以成为有状态的,但我不知道如何。