gpt4 book ai didi

c++ - 使用多线程解析c++字符串

转载 作者:行者123 更新时间:2023-11-28 07:32:56 24 4
gpt4 key购买 nike

我已经将一个巨大的文件映射到 char 字符串中,并从中生成了一个 c++ 字符串。我需要根据作为空格字符的定界字符解析此字符串,并将值存储在矩阵中。我可以从一个线程做到这一点,但我需要优化它。所以我使用多个线程来解析来自这个 sstream 的字符串并将其存储在 matrix 中。尽管基于线程 ID,我可以将解析后的数据同步存储到矩阵中,但是我如何同步解析,因为任何线程都可以随时安排并解析字符串。这是我的代码

void* parseMappedString(void* args)
{
char temp[BUFFSIZE];
long int threadID = *((long int*)args);
if (threadID < 0)
threadID = 0;

for (int i = ((threadID) * 160); i < ((threadID+1) * 160); i++)
{
for (int j = 0; j < 4000; j++)
{
pthread_mutex_lock(&ParseMatrixMutex);
if ((matrix_str.getline(temp,BUFFSIZE, ' ')) )
{
pthread_mutex_unlock(&ParseMatrixMutex);
matrix[i][j] = parseFloat((temp));
}
else
{
pthread_mutex_unlock(&ParseMatrixMutex);
}
}
}
}

void create_threads_for_parsing(void)
{
long int i;

for (i = 0; i < 5; i++)
pthread_create(&Threads[i], NULL, parseMappedString, (void*)&i);
}

在代码中,如果您看到总共有五个线程,每个线程处理 160 * 4000 个元素。他们根据线程 ID 存储到矩阵中的唯一位置。这样它就同步了。但是 getline 可以在任何时间由任何线程完成,因此线程 5 可以解析属于第一个线程的数据。我该如何避免这种情况?

我必须遵循,因为我在 args 中收到 1-4 个 threadid,但从来没有收到 0。它总是以一些垃圾负值的形式出现,因此我不得不像这样对其进行硬编码。

如果(线程 ID < 0) 线程ID = 0;

最佳答案

I have mmapped a huge file into char string and made a c++ string

不要,std::string 必须复制 内存,因此您将失去 mmap 本来可以带来的性能提升。只需将原始内存作为字符数组处理即可

I could do it from one thread but I need to optimize it

你确定多线程优化它吗?您是否分析并确认它绝对受 CPU 限制而不是 I/O 限制?


如果您确定多线程是可行的方法,我建议您这样做:

  1. 创建N个线程(这应该是基于内核的数量,然后根据测试结果进行调整)
  2. 将您的 mmap 区域分割成 N 个大致相等大小的 block
    • 你可以来回搜索离你的 block 边界最近的换行符
  3. 让每个线程 n 创建自己独立的输出
  4. 之后合并所有输出

至于代码中的错误,我试图说服您不要使用:您将 (void*)&i 作为参数传递给线程函数。这是一个指向在 create_threads_for_parsing 结束时超出范围的自动局部变量的指针,因此在任何线程读取它时它很可能是随机垃圾。即使它不是随机垃圾(即,如果 create_threads_for_parsing 在返回之前加入所有线程,以保持 i 在范围内),它也会对每个线程都是相同的指针

要安全地将不同的整数 id 传递给每个线程,您应该为每个线程分配一个不同的整数,并传递其地址。要么就是那样,要么就是乱用 intptr_t

关于c++ - 使用多线程解析c++字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17297567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com