Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 802
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Набросал код для экспериментов:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2015, 11:35
Ответы с готовыми решениями:

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

Обмен данными через указатель между потоками
Скажите, валидный ли такой код : #include <iostream> #include <thread> using namespace std;...

Инкремент переменной между потоками без atomic, с использованием mutex
Есть такой код: #include <iostream> #include <mutex> #include <thread> std::mutex mu;

Взаимодействие между потоками
В ходе выполнения программы необходимо, чтобы определенные действия выполнялись в отдельном потоке...

24
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 802
30.07.2015, 07:30  [ТС] 21
Author24 — интернет-сервис помощи студентам
Да при записи чтении этого массива структур в файл возникают ошибки...

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
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
30.07.2015, 07:41 22
Условные переменные
Цитата Сообщение от eagl69 Посмотреть сообщение
Такой вопрос, как передать кондитион в функцию:
Я же уже писал. У условных переменных нет конструкторов копирования/перемещения и операторов присвоения/перемещения.
0
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 802
30.07.2015, 07:58  [ТС] 23
А мьютекс передается без проблем...
void клиент (std::mutex *m_klient);

Добавлено через 11 минут
Да это я делал в консольном приложении...
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
30.07.2015, 07:58 24
Приведите пример кода. Гадалки в отпуске.
0
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 802
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2015, 08:39
Помогаю со студенческими работами здесь

Взаимодействие между потоками
Привет. Есть класс А, который содержит не статические методы, которые можно вызвать лишь с главного...

Интервал между потоками
Здравствуйте. Имеется несколько потоков. Необходимо при выполнении необходимой операции одним...

Связь между потоками
Пытаюсь реализовать змейку на qt и вот остановился на моменте связи между основным и другим...

Взаимодействие между потоками
Мне надо чтоб 1 поток перебирал числа из файла и , которые кратны 17, передавать второму потоку,...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru