Печать каждой итерации при возведении в степень

Рейтинг: 1Ответов: 1Опубликовано: 21.03.2015

Здравствуйте!

Написал программу, возводящую матрицу в определенную степень через потоки. Возможно ли как-то печатать матрицы при каждой итерации с потоками? Т.е. если нужно в 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;
}

Но выводит всё равно неправильно.

Ответы

Ответов пока нет.