Я работаю над доказательством программы тестирования понятий для игры, в которой определенные действия передаются в потоке, и информация выводится в окно команд для каждого потока. До сих пор я получил основной процесс потоковой обработки, но кажется, что couting в моей вызываемой функции не записывается для каждого потока, и вместо этого каждый поток перезаписывает другие.Неожиданный вывод при использовании потоков
Желаемый или ожидаемый результат состоит в том, что каждый поток выводит информацию, изнашиваемую в функции mCycle от mLaser. По сути, это предназначено для таймера сортировки для каждого объекта, отсчитывающего время, пока этот объект не выполнит свою задачу. Должен быть выход для каждого потока, поэтому, если пять потоков работают, должно быть пять счетчиков, отсчитывающих независимо.
Токовый выход таков, что каждый поток выводит свою собственную информацию в том же пространстве, которое затем перезаписывает то, что пытается выполнить другой поток.
Ниже приведен пример токового выхода программы:
Время до времени цикла до цикла 74, пока не завершится: 36 завершена:
92 секунд 2 секунды ССГ любую клавишу для продолжения. , ,
Вы можете видеть аберрации, в которых номера и другой текст находятся там, где их не должно быть, если вы изучите, как информация вычеркнута из mCycle.
Что должно отображаться более длинный эти строки:
Времени до цикл-не является полным:
92 секунды
Времени до цикл-не является полным:
112 секунд
Время до завершения цикла 3:
34 секунды
Цикл 4 завершен!
Я не уверен, что это связано с тем, что какая-то блокировка потоков происходит из-за того, как мой код структурирован или просто контролируется в моем кодировании вывода. Если бы я мог получить свежую пару глаз, чтобы просмотреть код и указать что-то, что может быть ошибкой, я был бы признателен.
Вот мой код, он должен быть скомпилирован в любом МСВСЕ 2013 года установить (без пользовательских библиотек, используемых)
#include <iostream>
#include <Windows.h>
#include <string>
#include <vector>
#include <random>
#include <thread>
#include <future>
using namespace std;
class mLaser
{
public:
mLaser(int clen, float mamt)
{
mlCLen = clen;
mlMAmt = mamt;
}
int getCLen()
{
return mlCLen;
}
float getMAmt()
{
return mlMAmt;
}
void mCycle(int i1, int mCLength)
{
bool bMCycle = true;
int mCTime_left = mCLength * 1000;
int mCTime_start = GetTickCount(); //Get cycle start time
int mCTime_old = ((mCTime_start + 500)/1000);
cout << "Time until cycle " << i1 << " is complete: " << endl;
while (bMCycle)
{
cout << ((mCTime_left + 500)/1000) << " seconds";
bool bNChange = true;
while (bNChange)
{
//cout << ".";
int mCTime_new = GetTickCount();
if (mCTime_old != ((mCTime_new + 500)/1000))
{
//cout << mCTime_old << " " << ((mCTime_new+500)/1000) << endl;
mCTime_old = ((mCTime_new + 500)/1000);
mCTime_left -= 1000;
bNChange = false;
}
}
cout << " \r" << flush;
if (mCTime_left == 0)
{
bMCycle = false;
}
}
cout << "Mining Cycle " << i1 << " finished" << endl;
system("Pause");
return true;
}
private:
int mlCLen;
float mlMAmt;
};
string sMCycle(mLaser ml, int i1, thread& thread);
int main()
{
vector<mLaser> mlasers;
vector<thread> mthreads;
future<string> futr;
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<> laser(1, 3);
uniform_int_distribution<> cLRand(30, 90);
uniform_real_distribution<float> mARand(34.0f, 154.3f);
int lasers;
int cycle_time;
float mining_amount;
lasers = laser(gen);
for (int i = 0; i < lasers-1; i++)
{
mlasers.push_back(mLaser(cLRand(gen), mARand(gen)));
mthreads.push_back(thread());
}
for (int i = 0; i < mlasers.size(); i++)
{
futr = async(launch::async, [mlasers, i, &mthreads]{return sMCycle(mlasers.at(i), i + 1, mthreads.at(i)); });
//mthreads.at(i) = thread(bind(&mLaser::mCycle, ref(mlasers.at(i)), mlasers.at(i).getCLen(), mlasers.at(i).getMAmt()));
}
for (int i = 0; i < mthreads.size(); i++)
{
//mthreads.at(i).join();
}
//string temp = futr.get();
//float out = strtof(temp.c_str(),NULL);
//cout << out << endl;
system("Pause");
return 0;
}
string sMCycle(mLaser ml, int i1, thread& t1)
{
t1 = thread(bind(&mLaser::mCycle, ref(ml), ml.getCLen(), ml.getMAmt()));
//t1.join();
return "122.0";
}
Спасибо за предложение, Mutexs были в моем списке возможных исправлений, однако я нашел возможный, более простой, способ обойти эту проблему используя shared_future, который можно скопировать (чтобы я мог заталкивать его в вектор). – Geowil