线程数据封装最佳实践
Thread data encapsulation best practices
我有一个问题,在这种情况下如何优雅地封装数据。假设我们想做一些可以从互联网异步下载图像的类。让我们有解锁方法:
void download(string url)
此方法将创建线程并开始下载,然后调用回调:
void callback(char* data)
什么是最好的:为下载器中的数据分配内存还是从下载器类中分配内存?在第一种情况下,我们需要复制回调中返回的数据,如果数据很大 - 它不好,否则我们将在 Downloader 类中分配内存并将其释放到其他地方。在第二种情况下,我们需要为数据分配内存,并将其作为下载方法中的参数传递:
char *data = new char[DATA_SIZE];
downloader.download(url, data);
但是我们如何保护这些分配的数据在下载线程使用时不从可调用线程更改它。我认为有某种方法可以使它在可调用线程中不同步,从而使此逻辑对客户端不可见。
希望你把我的想法弄对
一些C++标准库类可能会很好。
std::future<std::vector<unsigned char>> download(std::string url) {
std::promise<std::vector<unsigned char>> promise;
std::future<std::vector<unsigned char>> future = promise.get_future();
//I'm like 99% certain that both promise and future ref-count their shared state
//so it's probably safe to move and later even delete the promise object.
func_which_begins_asynchronous_process(url, std::move(promise));
return future;
}
void callback(std::vector<unsigned char> data, std::promise<std::vector<unsigned char>> promise) {
promise.set_value(std::move(data));
}
int main() {
auto future = download("google.com");
//Do whatever
std::vector<unsigned char> result = future.get();
//Do whatever
return 0;
}
这既可以使代码易于推理,又可以可靠地处理您在原始帖子中讨论的"指针所有权"问题。
我不知道您的代码的确切语义/要求,所以我的代码不会"按原样"在您的解决方案中工作,但这应该可以让您很好地了解解决您的问题的范式类型。
相关文章:
- 用于筛子的最佳数据结构是什么(即一些被划掉的数字列表)?
- 用于存储分组关系和支持外观的最佳数据结构
- 适用于频繁更改的大型数据集的最佳数据结构
- 点遍历的最佳数据结构
- 代表软件包安装和系统依赖关系的最佳数据结构
- 数字序列的最佳数据结构 [0:9]
- 什么是在C 中存储结果INT*的最佳数据类型
- 线程数据封装最佳实践
- 用于在具有更新查询的二维矩阵中查找最大值的最佳数据结构
- 数据封装实际上是如何在OOP中发生的
- 哪种数据结构是在一个向量中搜索和计数对象对的最佳数据结构
- 最佳数据结构存储文本文件中的数字集
- 用于随机访问和元素循环的最佳数据结构(C++)
- 可用于存储和管理整数集合的最佳C++数据结构是什么
- 使用C 中的单元格 /图块 /网格进行碰撞检测的最佳数据结构
- A*开放集的最佳数据结构是什么
- C++中用于插入和删除的最佳数据结构/容器
- 什么是支持优先级、更新、推送和弹出的最佳数据结构
- 将数据封装在类之外
- 将原始数据封装在类似std容器的数组中,具有运行时大小