Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 498
#1

Уведомления между потоками - C++

29.07.2015, 11:35. Просмотров 677. Ответов 24
Метки нет (Все метки)

Здравствуйте!
Набросал код для экспериментов:
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
31
32
33
34
35
36
37
38
39
40
#include "stdafx.h"
 
int блок_1(HWND *hWnd, MyStruct* strukt_1);
int сервис_1(HWND *hWnd, MyStruct* strukt_1);
 
void блок(HWND *hWnd, MyStruct* strukt_1)//запускаем основной поток
{
    int q = 0;
    do
    {
        std::thread potok_блок_1(блок_1, hWnd, strukt_1);
        potok_блок_1.detach();//отсоединение потока
        std::thread potok_сервис_1(сервис_1, hWnd, strukt_1);
        potok_сервис_1.detach();//отсоединение потока
        ++q;
    }
    while ( q != 9 );
}
 
int блок_1(HWND *hWnd, MyStruct* strukt_1)//поток подключения
{   
    do
    {
        Sleep(1000);//10 сек
        (*strukt_1).a = 0;
    }
    while ( true );
    return 0;
}
 
int сервис_1(HWND *hWnd, MyStruct* strukt_1)//поток подключения
{
    do
    {
        Sleep(10);
        
    }
    while ( (*strukt_1).a != 0 );
    return 0;
}
Смысл такой, запускаю 20 фоновых потоков. теперь после каких-то вычислений какой либо из потоков блок_1 изменяет состояние в структуре. А в потоках сервис_1 жду этого изменения в цикле время от времени проверяя... Так вот вопрос в том, как избавится от этих циклов? чтобы не грузить систему. А остановить поток пока не будет сделано изменений в потоке блок_1.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2015, 11:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Уведомления между потоками (C++):

Передача данных между потоками - C++
Есть сервер. Для каждого клиента он создает новый поток и работает с ними независимо от остальных...Например мне надо чтобы получив...

Отправка уведомления на e-mail - C++
Здравствуйте. Искал на форуме данную тему.Точнее есть коды на PHP и C# но я не понимаю как с ними работать. Не нашел на С++.Как же все таки...

Добавить вывода уведомления если стек полон или пуст - C++
Приветствую Столкнулся маленькой проблемкой. В код необходимо дописать строчки, чтобы выводило "Стек полон" и "Стек пуст", при “overflow”...

проблема с потоками - C++
Ребят при написании программы появилась проблема, опишу вкратце. пишу интерфейс WTL шаблонами. В MainWindow класса есть метод обработки...

Работа с потоками - C++
Задача поставлена так : Необходимо открыть поток, записать некую информацию и далее закрыть его. Но необходимо, чтобы после закрытия...

Работа с потоками - C++
Добрый вечер. Возникла такая проблема: в консольном приложении воспроизводится музыка при помощи mciSendString(s.c_str(), NULL, 0,...

24
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
29.07.2015, 13:34 #16
Цитата Сообщение от eagl69 Посмотреть сообщение
Те хочу добиться чтобы каждой группе данных соответствовал свой condition_variable
Так будет правильнее и сия конструкция носит гордое название инкапсуляция.
Хотя вектор лучше не использовать.
0
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 498
29.07.2015, 13:43  [ТС] #17
А чем плох вектор?

Добавлено через 1 минуту
Дело в том что у меня в структуре данные разных типов....
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
29.07.2015, 13:54 #18
Цитата Сообщение от eagl69 Посмотреть сообщение
А чем плох вектор?
Вектор требует наличие конструктора по умолчанию, конструктора копирования и оператора присвоения для хранимах объектов. Ни первого, ни второго, ни третьего у условных переменных нет. Вы элементарно не сможете поместить свои структуры в вектор с помощью push_back. Но если вы полагаете использовать emplace-функции то тоже можете нарваться на неприятности при перераспределении памяти вектора. Одним словом сплошные нихт зер гут.
0
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 498
29.07.2015, 14:02  [ТС] #19
А чем тогда лучше пользоваться?
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
29.07.2015, 14:23 #20
Цитата Сообщение от eagl69 Посмотреть сообщение
А чем тогда лучше пользоваться?
Массивы или независимое объявление.
0
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 498
30.07.2015, 07:30  [ТС] #21
Да при записи чтении этого массива структур в файл возникают ошибки...

C++
1
2
3
4
5
6
7
struct a
{
int a=1;
std::condition_variable cv;
}
 
std::vector<a> aa(10);
Добавлено через 5 минут
А записать этот массив в файл и потом прочитать можно будет? пробовал записать вектор выдает ошибку

Добавлено через 17 часов 1 минуту
Доброе утро!

Такой вопрос, как передать кондитион в функцию:
C++
1
2
3
4
5
std::condition_variable cv[10];
std::thread potok (клиент, &cv_klient);
potok.detach ();//отсоединение потока
 
void клиент (std::condition_variable *cv_klient);
Выдает ошибку:

Ошибка C2893 Сбой при специализации функции-шаблона "unknown-type std::invoke(_Callable &&,_Types &&...)" Сервер 3.01 d:\microsoft visual studio 14.0\vc\include\thr\xthread 238
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
30.07.2015, 07:41 #22
Условные переменные
Цитата Сообщение от eagl69 Посмотреть сообщение
Такой вопрос, как передать кондитион в функцию:
Я же уже писал. У условных переменных нет конструкторов копирования/перемещения и операторов присвоения/перемещения.
0
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 498
30.07.2015, 07:58  [ТС] #23
А мьютекс передается без проблем...
void клиент (std::mutex *m_klient);

Добавлено через 11 минут
Да это я делал в консольном приложении...
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
30.07.2015, 07:58 #24
Приведите пример кода. Гадалки в отпуске.
0
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 498
30.07.2015, 08:39  [ТС] #25
C++
1
2
3
4
std::mutex m;
std::thread potok (клиент, &m);
potok.detach ();//отсоединение потока
void клиент (std::mutex *m);
В консольном приложении это работает...

Добавлено через 25 минут
В общем если все обернуть в массив то работает...
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct uvedomleniy
{
    std::condition_variable cv_klient;
    std::mutex mutex_klient;
};
 
std::vector<uvedomleniy> uvedomleniy_mob(кол_клиентов);
 
std::thread potok_клиент_моб (клиент_моб, &uvedomleniy_mob);
    potok_клиент_моб.detach ();//отсоединение потока
 
void клиент_моб ( std::vector<uvedomleniy> *uvedomleniy_mob);
Добавлено через 2 минуты
C++
1
2
3
4
(*uvedomleniy_mob)[nomer_strohki].cv_klient.notify_one();//отсылаем уведомление
 
std::unique_lock<std::mutex> lk((*uvedomleniy_mob)[nomer_strohki].mutex_klient);//останавливаем поток до принятия уведомления
(*uvedomleniy_mob)[nomer_strohki].cv_klient.wait(lk, [=]() { return (*база_Kient_mob)[nomer_strohki].статус_клиента[0] == 0; });//проверка пораметра по уведомлению
0
30.07.2015, 08:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2015, 08:39
Привет! Вот еще темы с ответами:

Работа с потоками - C++
Поток main должен выполнить следующие действия: создать массив, размерность и элементы которого вводятся пользователем с консоли; ...

Парсинг потоками - C++
Здравствуйте. У меня есть текстовый файл объёмом где-то 10-50 мегобайт. В нём в текстовом виде хранятся числа и строки в известном мне...

Работа с потоками - C++
Пишу простой RSS агрегатор и уже практически доделал его в программе параллельно устанавливается соединение и потом извлекаем данные из...

Работа с потоками - C++
Задание Разработать программу, реализующую многопочность средствами среды Win32. Программа должна обеспечивать: Отображение списка...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru