我有一个问题,如何在这种情况下优雅地封装数据。 让我们想要制作一些可以从互联网异步下载图像的课程。让我们有解锁方法:
void download(string url)
此方法将创建线程并开始下载,然后调用回调:
void callback(char* data)
什么是最好的:为Downloader中的数据分配内存或将其分配给Downloader类?在第一种情况下,我们需要复制回调中返回的数据,如果数据很大 - 这是不好的,否则我们将在Downloader类中分配内存并将其释放到其他地方。在第二种情况下,我们需要为数据分配内存并将其作为参数传递给下载方法:
char *data = new char[DATA_SIZE];
downloader.download(url, data);
但是我们怎样才能保护这个分配的数据不被可调用线程更改,而下载器线程则使用它。我认为有一些方法可以让它在可调用线程中没有同步,以某种方式使这个逻辑对客户端不可见。
希望你能理解我的想法
答案 0 :(得分:0)
一些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;
}
这将使代码易于推理,并且可以可靠地处理您在原始帖子中讨论的“指针所有权”问题。
我不知道您的代码的确切语义/要求,因此我的代码将无法“按原样”在您的解决方案中工作,但这应该让您对将要解决的范例有很好的了解你的问题。