首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程数据封装最佳实践

线程数据封装最佳实践
EN

Stack Overflow用户
提问于 2017-03-29 18:11:31
回答 1查看 566关注 0票数 0

在这种情况下,我有一个问题,就是如何优雅地封装数据。让我们想想,我们想要做一些类,可以异步下载图像从互联网。让我们有一个解锁方法:

代码语言:javascript
复制
void download(string url)

此方法将创建线程并开始下载,然后调用回调:

代码语言:javascript
复制
void callback(char* data)

什么是最好的:为Downloader中的数据分配内存,还是将其分配给Downloader类?在第一种情况下,我们需要复制回调中返回的数据,如果数据很大--这并不好,否则我们将在Downloader类中分配内存并将其释放到其他地方。在第二种情况下,我们需要为数据分配内存,并在下载方法中将其作为参数传递:

代码语言:javascript
复制
char *data = new char[DATA_SIZE];
downloader.download(url, data);

但是,我们如何保护这些分配的数据不被可调用线程更改,同时由下载器线程使用它。我认为在可调用线程中有一些方法可以使它不同步,也可以使这种逻辑对客户端不可见。

希望你能让我头脑清醒

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-29 18:36:13

添加一些C++标准库类可能会更好。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43101056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档