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

标签 multithreading c++11

我是 C++11 线程的新手,我想知道如何管理工作线程(使用标准库)来执行一些任务然后消失。我有一个线程池 vector<thread *> thread_pool维护事件线程列表。

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

void worker_task()
{
    this_thread::sleep_for(chrono::milliseconds(1000));
    cout << "Hello, world!\n"
}

一旦工作线程终止,从池中可靠地删除线程的最​​佳方法是什么?主线程需要持续运行,不能阻塞在 join称呼。我对代码的一般结构比同步的复杂性更困惑。

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

最佳答案

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

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

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();
}

关于multithreading - C++11 - 管理工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24516928/

相关文章:

objective-c - 在 Objective-C 中创建两个线程

objective-c - 如何在A线程中调用很多方法?

java - 线程组调用中断后留下僵尸线程

multithreading - 软件线程与硬件线程

c++ - C++中链表的错误 “Abort signal from abort(3) (sigabrt) ”

java - 具有嵌套 ArrayList 的对象的线程安全 HashMap

c++ - Qt5 抛出 std::bad_alloc

c++ - 模板子类的工厂

c++ - array<int,2> dim 在这段代码中是什么意思?

c++ - C++11 中的空白比预处理标记分​​离更多?