在这种情况下,我有一个问题,就是如何优雅地封装数据。让我们想想,我们想要做一些类,可以异步下载图像从互联网。让我们有一个解锁方法:
void download(string url)此方法将创建线程并开始下载,然后调用回调:
void callback(char* data)什么是最好的:为Downloader中的数据分配内存,还是将其分配给Downloader类?在第一种情况下,我们需要复制回调中返回的数据,如果数据很大--这并不好,否则我们将在Downloader类中分配内存并将其释放到其他地方。在第二种情况下,我们需要为数据分配内存,并在下载方法中将其作为参数传递:
char *data = new char[DATA_SIZE];
downloader.download(url, data);但是,我们如何保护这些分配的数据不被可调用线程更改,同时由下载器线程使用它。我认为在可调用线程中有一些方法可以使它不同步,也可以使这种逻辑对客户端不可见。
希望你能让我头脑清醒
发布于 2017-03-29 18:36:13
添加一些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;
}这将使代码易于推理,并将可靠地处理您在原始文章中讨论的“指针所有权”问题。
我不知道您的代码的确切语义/要求,所以我的代码不会在您的解决方案中“按原样”工作,但是这将给您一个很好的解决问题的范例。
https://stackoverflow.com/questions/43101056
复制相似问题