Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
1 / 1 / 2
Регистрация: 30.11.2014
Сообщений: 67

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

18.10.2016, 22:35. Показов 2136. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.10.2016, 22:35
Ответы с готовыми решениями:

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

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

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

6
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
18.10.2016, 22:46
Лучший ответ Сообщение было отмечено Dmitry_V как решение

Решение

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

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


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



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

я вообще не понимаю
мозгулек мало(((((((((((
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
18.10.2016, 23:04
Лучший ответ Сообщение было отмечено Dmitry_V как решение

Решение

Dmitry_V, извините, не понял вопроса.
1
1 / 1 / 2
Регистрация: 30.11.2014
Сообщений: 67
18.10.2016, 23:16  [ТС]
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
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
18.10.2016, 23:21
Лучший ответ Сообщение было отмечено Dmitry_V как решение

Решение

Цитата Сообщение от Dmitry_V Посмотреть сообщение
НО без слипа ничего не работает, а его не желательно использовать, как быть?)
ну так у вас в WaitForSingleObject указан таймаут в одну миллисекунду...
поток ждет события в этот промежуток и по его окончании продолжает работу.
попробуйте указать "ждать вечно" - INFINITE - тогда поток будет продолжать работу только после прихода события.
1
1 / 1 / 2
Регистрация: 30.11.2014
Сообщений: 67
18.10.2016, 23:30  [ТС]
точно, спасибо Вам большое, Вы очень помогли!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.10.2016, 23:30
Помогаю со студенческими работами здесь

Синхронизация потоков
Есть статический класс к которому я хочу обращаться из разных потоков static class MyLog { public: static int log(std::string,...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru