首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11 -管理工作线程

C++11 -管理工作线程
EN

Stack Overflow用户
提问于 2014-07-01 18:22:27
回答 1查看 594关注 0票数 4

我对C++11中的线程很陌生,我想知道如何管理工作线程(使用标准库)来执行某些任务,然后消失。我有一个线程池vector<thread *> thread_pool,它维护一个活动线程列表。

假设我启动一个新线程并使用thread_pool.push_back(new thread(worker_task))将其添加到池中,其中worker_task的定义如下:

代码语言:javascript
复制
void worker_task()
{
    this_thread::sleep_for(chrono::milliseconds(1000));
    cout << "Hello, world!\n"
}

工作线程结束后,从池中可靠地删除线程的最佳方法是什么?主线程需要连续运行,不能在join调用上阻塞。与同步的复杂性相比,我对代码的一般结构更加困惑。

编辑:,看起来我在代码中误用了池的概念。我的意思是我有一个当前正在运行的线程列表。

EN

回答 1

Stack Overflow用户

发布于 2014-07-01 18:47:45

您可以使用std::线程::“将执行线程与线程对象分开,允许执行独立地继续。一旦线程退出,任何分配的资源都将被释放。”

如果每个线程应该使其状态可见,则可以将此功能移动到线程函数中。

代码语言:javascript
复制
std::mutex mutex;
using strings = std::list<std::string>;
strings info;

strings::iterator insert(std::string value) {
    std::unique_lock<std::mutex> lock{mutex};
    return info.insert(info.end(), std::move(value));
}

auto erase(strings::iterator p) {
    std::unique_lock<std::mutex> lock{mutex};
    info.erase(p);
}

template <typename F>
void async(F f) {
    std::thread{[f] {
        auto p = insert("...");
        try {
            f();
        } catch (...) {
            erase(p);
            throw;
        }
        erase(p);
    }}.detach();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24516928

复制
相关文章

相似问题

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