c++ - C++ 异步释放数据

标签 c++ asynchronous

我得到这样的数据结构:

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 (使得“异步清除”完全毫无意义) ),如果不是,您将引入竞争条件,这甚至可能导致您的程序崩溃,因为您将同时操作共享资源。 (不是一个好主意)。

如果您仍然想这样做,这里有一个可能有效的方法:

  1. 将“myData”设为指针并对其进行操作。
  2. 想要清除时,将该指针存储在另一个指针变量中,并用 new My_Data 替换该指针。
  3. 将存储的指针传递给异步“自由”函数。
  4. 继续在原始线程中使用新的数据结构。

这样,您就不再使用共享资源,并且异步释放变得可行。

至于“如何”,如果您有 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/

相关文章:

C++ 编译错误 - 命名空间 std 中的 "no type named ' 函数”

c++ - Thrift 异步 C++ 示例

java - 如何知道另一个线程是否进行 SynchronousQueue 轮询?

http - 响应后异步工作

java - 从另一个 Lambda 函数异步启动 AWS java Lambda 函数

c++ - C++类中的ID数据成员

python - 如何将 C++ 函数周围的 R 包装器转换为 Python/Numpy

c++ - 如何使异步并行程序代码易于管理(例如在 C++ 中)

c++ - 将数组转换为 vector

c++ - 程序不能正确计算减法