CARLA
 
载入中...
搜索中...
未找到
ThreadGroup.h
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7#pragma once // 确保头文件只被包含一次,避免重复包含导致的问题
8
9#include "carla/Debug.h" // 包含自定义调试功能的头文件
10#include "carla/NonCopyable.h" // 包含定义 NonCopyable 类的头文件,避免类被复制
11
12#include <thread> // 包含线程相关的库
13#include <vector> // 包含迭代器相关的头文件,定义了与迭代器操作相关的功能
14
15namespace carla {
16
17 // ThreadGroup 类用于管理一组线程,并确保它们在销毁时被正确地等待
18 class ThreadGroup : private NonCopyable { // 继承自 NonCopyable,防止复制该类
19 public:
20
21 ThreadGroup() = default; // 默认构造函数
22
23 ~ThreadGroup() { // 析构函数
24 JoinAll(); // 在销毁时确保所有线程都已完成
25 }
26
27 // 创建一个新线程并执行给定的可调用对象。
28 // 模板参数 F 是一个可调用对象类型。
29
30 template <typename F>
31 void CreateThread(F &&functor) {
32 _threads.emplace_back(std::forward<F>(functor)); // 将线程添加到容器中
33 }
34 // 创建多个线程,每个线程执行相同的可调用对象
35 template <typename F>
36 void CreateThreads(size_t count, F functor) {
37 _threads.reserve(_threads.size() + count); // 预留足够的空间以避免频繁的内存分配
38 for (size_t i = 0u; i < count; ++i) {
39 CreateThread(functor); // 创建线程并执行 functor
40 }
41 }
42
43 // 等待所有线程完成
44 void JoinAll() {
45 for (auto &thread : _threads) {
46 DEBUG_ASSERT_NE(thread.get_id(), std::this_thread::get_id());
47 if (thread.joinable()) { // 检查线程是否可加入
48 thread.join(); // 等待线程完成
49 }
50 }
51 _threads.clear(); // 清除线程容器
52 }
53
54 private:
55
56 std::vector<std::thread> _threads; // 存储线程的容器
57 };
58
59}
#define DEBUG_ASSERT_NE(lhs, rhs)
Definition Debug.h:82
这个类用于禁止拷贝和移动构造函数及赋值操作
std::vector< std::thread > _threads
Definition ThreadGroup.h:56
void CreateThreads(size_t count, F functor)
Definition ThreadGroup.h:36
ThreadGroup()=default
void CreateThread(F &&functor)
Definition ThreadGroup.h:31
CARLA模拟器的主命名空间。
Definition Carla.cpp:139