1 / 1 / 2
Регистрация: 30.11.2014
Сообщений: 67
1

синхронизация потоков

18.10.2016, 22:35. Показов 1652. Ответов 6
Метки нет (Все метки)

проблема в следующем:
есть 2 потока
один считает некоторую сумму в цикле по столбцам матрицы
второй должен выводить промежуточную сумму после каждого столбца

пытался синхронизировать с помощью мьютексов, не получилось
с событиями тоже


вот последний листинг

в этом случае он проходит один внешний цикл, выводит нужный результат, идет обратно в цикл считает следующий, но не выводит результат(((

помогите допереть

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
DWORD WINAPI Thread1(CONST LPVOID lpParam) 
{ 
    WaitForSingleObject(Event1,1);
 
    sum = 0;
 
    for ( int i = i1 - 1; i <= i2 - 1 && i < row; i++)
        {WaitForSingleObject(Event1,1);
        for ( int j = j1 - 1; j <= j2 - 1 && j < column; j++)
            sum += p_matrix1 [i][j];
        SetEvent(Event2);
        ResetEvent(Event1);}
                
    ExitThread(0);
}
 
 
DWORD WINAPI Thread2(CONST LPVOID lpParam)
{
    WaitForSingleObject(Event2,1);
 
    SetEvent(Event1);
    ResetEvent(Event2);
 
    cout << endl << endl << "THE SUM of the elements submatrix:  " << sum << endl << endl;
 
    ExitThread(0);
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2016, 22:35
Ответы с готовыми решениями:

Синхронизация потоков
Добрый день. Как синхронизировать потоки, чтобы вывод в stdout был поочередным: foo bar foo bar?...

Синхронизация потоков
Снова привет. Есть у меня код, который требуется раскидать на потоки. Ниже код: #include...

Синхронизация потоков в c++
Совершенно не понятно что не так и как правильно. Задача: Отсортировать массив целых чисел....

Синхронизация потоков
Есть статический класс к которому я хочу обращаться из разных потоков static class MyLog {...

6
шКодер самоучка
2171 / 1878 / 912
Регистрация: 09.10.2013
Сообщений: 4,123
Записей в блоге: 7
18.10.2016, 22:46 2
Лучший ответ Сообщение было отмечено Dmitry_V как решение

Решение

Цитата Сообщение от Dmitry_V Посмотреть сообщение
но не выводит результат
ну так после первого раза 2й поток(Thread2) завершается...

Цитата Сообщение от Dmitry_V Посмотреть сообщение
помогите допереть
Думаю что стоит оформить содержимое Thread2 циклом, но тут потребуется какой нибудь флаг/условие, что работа завершена - матрица посчитана полностью.
1
1 / 1 / 2
Регистрация: 30.11.2014
Сообщений: 67
18.10.2016, 22:58  [ТС] 3
Цитата Сообщение от Max Dark Посмотреть сообщение
ну так после первого раза 2й поток(Thread2) завершается...


Думаю что стоит оформить содержимое Thread2 циклом, но тут потребуется какой нибудь флаг/условие, что работа завершена - матрица посчитана полностью.
тогда такой вопрос, когда в первом потоке я делаю
Цитата Сообщение от Dmitry_V Посмотреть сообщение
ResetEvent(Event1);
, то разве при входе
Цитата Сообщение от Dmitry_V Посмотреть сообщение
WaitForSingleObject(Event1,1);
он не должен не выполнять?



он при первом вызове даже до конца второго потока еще не доходит, а уже отдает управление обратно первому

я вообще не понимаю
мозгулек мало(((((((((((
0
шКодер самоучка
2171 / 1878 / 912
Регистрация: 09.10.2013
Сообщений: 4,123
Записей в блоге: 7
18.10.2016, 23:04 4
Лучший ответ Сообщение было отмечено Dmitry_V как решение

Решение

Dmitry_V, извините, не понял вопроса.
1
1 / 1 / 2
Регистрация: 30.11.2014
Сообщений: 67
18.10.2016, 23:16  [ТС] 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
DWORD WINAPI Thread1(CONST LPVOID lpParam) 
{ 
    WaitForSingleObject(Event1,1);
 
    sum = 0;
 
    for ( int i = i1 - 1; i <= i2 - 1 && i < row; i++)
        {WaitForSingleObject(Event1,1);
        for ( int j = j1 - 1; j <= j2 - 1 && j < column; j++)
            sum += p_matrix1 [i][j];
        SetEvent(Event2);
        ResetEvent(Event1);
        Sleep(100);}
                
    ExitThread(0);  //завершение работы потока
}
 
 
DWORD WINAPI Thread2(CONST LPVOID lpParam)
{
 
    for ( int i = i1 - 1; i <= i2 - 1 && i < row; i++)
        {WaitForSingleObject(Event2,1);
        cout << endl << endl << "THE SUM of the elements submatrix:  " << sum << endl << endl;
        SetEvent(Event1);
        ResetEvent(Event2);
        Sleep(100);}
 
    ExitThread(0);  //завершение работы потока
}

последовал Вашему совету, все работает, НО без слипа ничего не работает, а его не желательно использовать, как быть?)
0
шКодер самоучка
2171 / 1878 / 912
Регистрация: 09.10.2013
Сообщений: 4,123
Записей в блоге: 7
18.10.2016, 23:21 6
Лучший ответ Сообщение было отмечено Dmitry_V как решение

Решение

Цитата Сообщение от Dmitry_V Посмотреть сообщение
НО без слипа ничего не работает, а его не желательно использовать, как быть?)
ну так у вас в WaitForSingleObject указан таймаут в одну миллисекунду...
поток ждет события в этот промежуток и по его окончании продолжает работу.
попробуйте указать "ждать вечно" - INFINITE - тогда поток будет продолжать работу только после прихода события.
1
1 / 1 / 2
Регистрация: 30.11.2014
Сообщений: 67
18.10.2016, 23:30  [ТС] 7
точно, спасибо Вам большое, Вы очень помогли!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2016, 23:30
Помогаю со студенческими работами здесь

Синхронизация потоков - C++
Что это? Как это исправить? &quot;ConsoleApplication2.exe&quot; (Win32). Загружено...

Синхронизация процессов и потоков
Помогите с заданием, пожалуйста.

Синхронизация потоков на семафорах
почему не работает синхронизация потоков на семафорах? при компиляции ошибка сегментирования. На...

Синхронизация потоков Event c++
Необходимо, чтобы нить t4 ждала события просчета времени &quot;time = 1000 * (getTime() - time);&quot; и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru