为了给每个线程分配一个唯一的字符串名称,并结合 std::map 和线程 ID 来管理这些名称,我们可以按照以下步骤进行:
- 使用 std::map 将每个线程的 std::thread::id 映射到对应的线程名称。
- 在创建线程时,将线程 ID 和对应的名称存储在 std::map 中。
- 在线程函数中,通过 std::this_thread::get_id() 获取当前线程的 ID,并从 std::map 中查找对应的线程名称。
- 使用 join 等待所有线程完成。
下面是一个完整的示例代码:
#include <iostream>
#include <vector>
#include <thread>
#include <map>
#include <omp.h> // 包含 OpenMP 头文件
#include <mutex> // 用于保护线程名称的访问
std::map<std::thread::id, std::string> threadNameMap; // 存储线程 ID 和名称的映射
std::mutex mtx; // 互斥量,用于保护对 threadNameMap 的访问
// 定义一个大运算的函数,使用 OpenMP 加速
void computeChunk(int start, int end, const std::thread::id& threadId) {
std::vector<int> data(end - start);
// 使用 OpenMP 并行处理数组的一部分
#pragma omp parallel for
for (int i = start; i < end; ++i) {
data[i - start] = i * i; // 简单的计算示例
}
// 获取线程名称
std::lock_guard<std::mutex> lock(mtx); // 保护 threadNameMap 的访问
auto it = threadNameMap.find(threadId);
if (it != threadNameMap.end()) {
std::cout << "Thread Name: " << it->second << ", Handling chunk from " << start << " to " << end << std::endl;
}
}
int main() {
const int numThreads = 4; // 线程数量
const int totalWorkload = 1000000; // 总工作量
const int chunkSize = totalWorkload / numThreads; // 每个线程的工作量
std::vector<std::thread> threads;
// 创建线程组,并为每个线程分配一个名称
for (int i = 0; i < numThreads; ++i) {
std::string threadName = "Thread_" + std::to_string(i + 1); // 生成线程名称
// 创建线程并传递线程 ID 和工作范围
threads.emplace_back([threadName, chunkSize, i]() {
std::thread::id threadId = std::this_thread::get_id(); // 获取当前线程 ID
// 将线程 ID 和名称存储到 map 中
{
std::lock_guard<std::mutex> lock(mtx); // 保护 threadNameMap 的访问
threadNameMap[threadId] = threadName;
}
int start = i * chunkSize;
int end = (i + 1) * chunkSize;
computeChunk(start, end, threadId); // 执行计算任务
});
}
// 等待所有线程完成
for (auto& t : threads) {
t.join();
}
std::cout << "All threads completed their work." << std::endl;
return 0;
}
代码说明
- 全局变量:
- threadNameMap:一个 std::map,用于存储线程 ID 和线程名称的映射关系。
- mtx:一个 std::mutex,用于保护对 threadNameMap 的并发访问,确保线程安全。
- computeChunk 函数:
- 这是每个线程要执行的任务函数。
- 使用 OpenMP 并行处理数据。
- 从 threadNameMap 中查找当前线程的名称并输出。
- 主线程:
- 创建和管理线程组。
- 为每个线程分配一个唯一的名称,并将其存储在 threadNameMap 中。
- 等待所有线程完成。