Проект запускает точку останова после многопоточности одной функции - PullRequest
0 голосов
/ 28 августа 2018

У меня есть function, onAddFunction(), который вызывается внутри for loop для каждой текстуры в моем проекте. Я добавил многопоточность, обернув цикл for в другой for loop, который связывает каждый поток в vector из threads с внутренним for loop (через выражение lambda). Ниже приведен фрагмент onAddFunction(), который ломается, и я не уверен почему.

std::mutex mtx;
mtx.try_lock();
union //I have tried changing this from union to struct to no avail
{
    unsigned char*  ImageData = nullptr;
    FFloat16Color*  ImageFloat16;
    uint16 *        ImageUINT16;
} imgData;
TArray<uint8> data;
uTex->Source.GetMipData(data, 0);
imgData.ImageData = data.GetData(); //Breaks Here
mtx.unlock();

Вот вложенные циклы for, вызывающие эту функцию:

const size_t nthreads = std::thread::hardware_concurrency();
std::vector<std::thread> threads(nthreads);
for (int t = 0; t < nthreads; t++)
{
    threads[t] = std::thread(std::bind(
        [&](const int bi, const int ei, const int t)
    {
        //Add new items
        for (int i = bi; i < ei; i++) //beginindex / endindex
        {
            auto object = onAddFunction(texAddList[i]); //The breakpoint is being triggered inside this function
            objectLinks[textureAddList[i]] = object;
        }
    }, t * mAddList.size() / nthreads, (t + 1) == nthreads ?
        mAddList.size() : (t + 1) * mAddList.size() / nthreads, t));
} std::for_each(threads.begin(), threads.end(), [](std::thread& x){x.join(); });

Код диспетчеризации потока в основном взят из здесь . Единственная обратная связь, которую я получаю, - то, что мой проект вызвал точку останова. Над этим в моем окне вывода просто нормальные вещи.

...