Многопоточность Сортировка C ++ (завершить вызов без активного исключения) - PullRequest
0 голосов
/ 01 марта 2020

Только начал изучать многопоточность на с ++ и хотел поэкспериментировать с ней. Поэтому я пытаюсь разбить массив на количество физических ядер (переменная nt), отсортировать каждую часть в независимом потоке и затем объединить их, но я получаю сообщение об ошибке завершения без активного исключения.

void MergeSortV5(int *v,int ii,int is,int nt)
{

    int lp=is/nt;
    thread t[nt-1];
    int ai,as=0;
    for(int i=0; i<nt-1; i++)
    {
        ai=as+1;
        as=ai+lp-1;
        t[i]=thread (MergeSortV2,v,ai,as);
    }
    ai=as+1;
    as=is;
    t[nt-1]=thread (MergeSortV2,v,ai,as);
    for(int i=0; i<nt; i++)
            t[i].join();
}

MergeSortV2 - это обычная сортировка слиянием. Из того, что я понимаю, это исключение вызвано тем, что потоки заканчиваются sh быстрее, чем основная программа (что, конечно, имело место в примерах с маленьким массивом, которые я пробовал), но я не могу исправить это, я попытался отсоединить потоки и присоединение к ним позже, если возможно, или немедленное присоединение к ним, но ошибка по-прежнему возникает.

1 Ответ

2 голосов
/ 01 марта 2020

Массив t выделен с неправильным размером (nt вместо nt-1). Кроме того, рассмотрите возможность использования динамически размещаемого массива, поскольку nt не определен во время компиляции (см. здесь для получения дополнительной информации).

thread* t = new thread[nt];
[...]
delete[] t;

Или событие лучше: a std::vector<std::thread>!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...