📜  线程组 c++ (1)

📅  最后修改于: 2023-12-03 15:27:33.294000             🧑  作者: Mango

线程组 C++

介绍

线程组是C++11标准中提供的一种用于管理和协调一组线程的机制,可以让我们方便地创建、启动和停止一组线程。

常见的使用场景是:需要启动多个线程完成任务,当任务完成后需要等待所有线程退出再进行下一步操作。在这种情况下,可以使用线程组来管理这些线程。

线程组

线程组是一个可以容纳一组线程的对象,在C++11中被定义在头文件<thread>中。创建一个线程组的方法很简单:

std::thread_group tg;

通过std::thread_group来管理一组线程,可以使用以下操作:

  • std::thread_group::add_thread(std::thread& t):将线程t添加到线程组中。
  • std::thread_group::remove_thread(std::thread& t):从线程组中移除线程t
  • std::thread_group::join_all():等待所有线程退出。
使用线程组

下面的示例演示了如何使用线程组创建和启动线程,并等待它们完成。我们想要同时下载三个网页,然后等待它们都下载完成后再进行下一步操作:

#include <iostream>
#include <string>
#include <vector>
#include <thread>
#include <mutex>
#include <chrono>
#include <thread>

using namespace std::chrono_literals;

std::mutex g_mutex;

void download(const std::string& url)
{
    std::lock_guard<std::mutex> lock(g_mutex);
    std::cout << "Downloading " << url << "\n";
    std::this_thread::sleep_for(3s);
}

int main()
{
    // 创建一个线程组
    std::thread_group tg;

    // 下载三个网页的URL
    std::vector<std::string> urls{ "https://www.baidu.com", "https://www.google.com", "https://www.github.com" };

    // 启动三个线程并将它们添加到线程组中
    for (auto& url : urls)
    {
        tg.create_thread(std::bind(download, url));
    }

    // 等待所有线程退出
    tg.join_all();

    // 所有线程下载完成
    std::cout << "All downloads have completed.\n";

    // 继续进行下一步操作
    // ...

    return 0;
}
完整示例

完整示例代码可以在下面找到,包括三个线程依次输出下载进度:

#include <iostream>
#include <string>
#include <vector>
#include <thread>
#include <chrono>
#include <mutex>

using namespace std::chrono_literals;

std::mutex g_mutex;

void download(const std::string& url)
{
    std::unique_lock<std::mutex> lock(g_mutex);
    std::cout << "Start downloading " << url << "\n";
    lock.unlock();

    for (int i = 0; i < 5; ++i)
    {
        std::this_thread::sleep_for(1s);

        lock.lock();
        std::cout << "Downloading " << url << " " << i << "/5\n";
        lock.unlock();
    }

    lock.lock();
    std::cout << "Downloaded " << url << " finished.\n";
    lock.unlock();
}

int main()
{
    // 创建线程组
    std::thread_group tg;

    // 启动并添加线程到线程组中
    tg.create_thread(std::bind(download, "https://www.baidu.com"));
    tg.create_thread(std::bind(download, "https://www.google.com"));
    tg.create_thread(std::bind(download, "https://www.github.com"));

    // 等待所有线程退出
    tg.join_all();

    // 所有线程下载完成
    std::cout << "All downloads have completed.\n";

    return 0;
}
结论

线程组是一个方便的机制,可以管理多个线程。我们可以通过add_threadremove_threadjoin_all等操作来添加、删除、等待线程。

在实际应用中,我们可以使用线程组来管理多个线程并保证它们在合适的时候启动和结束。