У меня есть 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(); });
Код диспетчеризации потока в основном взят из здесь . Единственная обратная связь, которую я получаю, - то, что мой проект вызвал точку останова. Над этим в моем окне вывода просто нормальные вещи.