我得到这样的数据结构:
struct My_data
{
MyArray<float> points;
MyArray<float> normals;
MyArray<float> uvCoords;
};
此函数可用于释放它们:
void ClearAlembicData(My_data* myData)
{
myData->points.clear();
myData->normals.clear();
myData->uvCoords.clear();
}
我想异步清理 myData,以便程序不会等待所有 xxx.clear() 完成。这是我的实际代码:
My_data myData;
myData.point.push_back(point);
myData.nomals.push_back(nomals);
myData.uvCorrds.push_back(uvCorrds);
ClearAlembicData(&myData);
myData.point.push_back(point);
myData.nomals.push_back(nomals);
myData.uvCorrds.push_back(uvCorrds);
你能告诉我如何在 C++ 中做到这一点吗?谢谢
最佳答案
根据 MyArray
的定义,这将导致未定义的行为或完全没有意义。
如果容器是线程安全的,它会在另一个线程中执行 clear
时阻塞您的 push_back
(使得“异步清除”完全毫无意义) ),如果不是,您将引入竞争条件,这甚至可能导致您的程序崩溃,因为您将同时操作共享资源。 (不是一个好主意)。
如果您仍然想这样做,这里有一个可能有效的方法:
- 将“myData”设为指针并对其进行操作。
- 想要清除时,将该指针存储在另一个指针变量中,并用
new My_Data
替换该指针。 - 将存储的指针传递给异步“自由”函数。
- 继续在原始线程中使用新的数据结构。
这样,您就不再使用共享资源,并且异步释放变得可行。
至于“如何”,如果您有 C++11,类似这样的东西就可以了(伪代码)。
My_data *myData = new My_data();
myData->point.push_back(point);
myData->nomals.push_back(nomals);
myData->uvCorrds.push_back(uvCorrds);
std::thread([=](){ ClearAlembicData(myData); delete myData; }).detach();
myData = new My_data()
myData->point.push_back(point);
myData->nomals.push_back(nomals);
myData->uvCorrds.push_back(uvCorrds);
delete myData;
关于c++ - C++ 异步释放数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72570545/