Печать каждой итерации при возведении в степень
Здравствуйте!
Написал программу, возводящую матрицу в определенную степень через потоки. Возможно ли как-то печатать матрицы при каждой итерации с потоками? Т.е. если нужно в 3-ю степень возвести, то и вторую тоже нужно вывести на печать. С одним потоком всё просто и понятно, но с 2 и более уже возникают проблемы.
Может, здесь с событиями нужно работать или с синхронизацией потоков (хотя еще не до конца события и синхронизацию понял)?
unsigned __stdcall threadMult(void *param){
int id = (int)param;
Pow(matr_3, matr_1, N, POW, id);
return 0;
}
int main()
{
matr_1 = new int *[N];
matr_3 = new int *[N];
for (int i = 0; i<N; i++)
matr_1[i] = new int[N];
for (int i = 0; i<N; i++)
matr_3[i] = new int[N];
srand(time(0));
for (int i = 0; i<N; i++)
for (int j = 0; j<N; j++)
matr_1[i][j] = rand() % 3;
PrintArray(matr_1, N);
cout << endl;
clock_t start, end;
start = clock();
HANDLE hThreads[NUMBER_OF_THREADS];
unsigned id;
for (int i = 0; i < NUMBER_OF_THREADS; i++)
hThreads[i] = (HANDLE)_beginthreadex(NULL, 0, threadMult, (void *)i, 0, &id);
WaitForMultipleObjects(NUMBER_OF_THREADS, hThreads, TRUE, INFINITE);
for (int i = 0; i < NUMBER_OF_THREADS; i++)
CloseHandle(hThreads[i]);
PrintArray(matr_3, N);
end = clock() - start;
cout << endl << "runtime: " << end / (double)CLOCKS_PER_SEC << endl;
cout << endl;
DeleteArray(matr_1, N);
DeleteArray(matr_3, N);
//system("pause");
return 0;
}
update:
В main добавил
for (int i = 0; i < NUMBER_OF_THREADS; i++)
hEvents[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
И изменил функцию: unsigned __stdcall threadMult(void *param){
int id = (int)param;
Pow(matr_3, matr_1, N, POW, id);
SetEvent(hEvents[id]);
WaitForSingleObject(hEvents[1 - id], INFINITE);
PrintArray(matr_3, N);
cout << endl;
return 0;
}
Но выводит всё равно неправильно.
Источник: Stack Overflow на русском