我已经将一个巨大的文件映射到 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 个线程 ID,但从来没有收到 0。它总是以一些垃圾负值的形式出现,因此我不得不像这样对其进行硬编码。
如果(线程 ID < 0)线程 ID = 0;