Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/40: Рейтинг темы: голосов - 40, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 14.05.2019
Сообщений: 34

Безопасная передача данных между потоками

07.06.2019, 10:42. Показов 7890. Ответов 5

Студворк — интернет-сервис помощи студентам
У меня есть два класса (описаны в разных файлах). В классе1 есть массив, который я хочу передать классу2 для изменения. Для этого я вызываю функцию из класса2, куда по ссылке передаю свой массив. Но эта функция должна вызываться в другом потоке. Нет гарантии, что классу1 из первого потока не понадобиться использовать этот массив в момент обработки (для отображения или изменения). При этом я не могу сделать join, так как это gui и всё зависнет.

Как правильно безопасно передать массив из одного потока в другой?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.06.2019, 10:42
Ответы с готовыми решениями:

Передача параметров между потоками
нужна помощь, здесь есть баг найти не могу( Суть задачи: поток в C ++ Builder с передачей параметров первий юніт #include...

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

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

5
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
07.06.2019, 11:12
Могу предложить в качестве варианта передать копию:

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
class First
{
public:
    std::vector<int> copyData() const {
        std::lock_quard<std::mutex> lockGuard(mMutex);
        return mData;
    }
 
    void setData(std::vector<int> newData) {
        std::lock_quard<std::mutex> lockGuard(mMutex);
        mData.swap(newData);
    }
    std::vector<int> mData;
    mutable std::mutex mMutex;
};
 
 
class Second
{
    void foo(First & first) {
        std::vector<int> data = first.copyData();
        //работаем
        first.setData(std::move(data));
    }
};
1
1 / 1 / 0
Регистрация: 14.05.2019
Сообщений: 34
07.06.2019, 11:41  [ТС]
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Могу предложить в качестве варианта передать копию:
Спасибо за вариант. Вопрос: у меня массив порядка 60000 int. Не много ли это, чтобы делать копию?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.06.2019, 11:44
Цитата Сообщение от karen_gril Посмотреть сообщение
Спасибо за вариант. Вопрос: у меня массив порядка 60000 int. Не много ли это, чтобы делать копию?
Копию делать не надо, достаточно ссылки. Главное блокировать мьютекс, везде где ты изменяешь/читаешь массив
0
1 / 1 / 0
Регистрация: 14.05.2019
Сообщений: 34
07.06.2019, 11:49  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Копию делать не надо, достаточно ссылки. Главное блокировать мьютекс, везде где ты изменяешь/читаешь массив
А можно пример с ссылкой? Когда массив в одном классе использовался, я мьютексами обошлась. А вот с передачей в функцию из другого класса у меня какой-то затык. Где этот мьютекс объявить? Как к нему получать доступ из обоих классов?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.06.2019, 11:57
Цитата Сообщение от karen_gril Посмотреть сообщение
А можно пример с ссылкой? Когда массив в одном классе использовался, я мьютексами обошлась. А вот с передачей в функцию из другого класса у меня какой-то затык. Где этот мьютекс объявить? Как к нему получать доступ из обоих классов?
Мьютекс объявляешь там же, где массив.
В функцию либо передаёшь две ссылки - на массив и на мьютекс. Но лучше сделать в том же классе, где массив, метод и передавать в другой поток ссылку на класс, а там уже вызывать этот метод

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class CTest
{
public:
   void AddItem(int x)
  {
     std::lock_guard<std::mutex> lock(m_mx);
     m_items.emplace_back(x);
  }
 
    template <typename TFunc>
    void ForEach(TFunc &&func)
   {
      std::lock_guard<std::mutex> lock(m_mx);
      for (auto &item: m_items)
          func(item);
   }
 
protected:
    std::mutex m_mx;
    std::vector<int> m_items;
}
Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
CTest test;
std::thread thread([&test]()
{
   inst sum = 0;
   test.ForEach([&sum](int x)
  {
      sum += x;
   });
});
 
test.AddItem(1);
test.AddItem(2);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.06.2019, 11:57
Помогаю со студенческими работами здесь

Безопасная передача данных между клиентом и сервером
Здравствуйте. Я новичок в среде программирования WEB-ресурсов, поэтому не судите строго за глупые вопросы. А вопрос состоит вот в чем. В...

Передача данных между потоками
Подскажите пожалуйста как передать объект между потоками через сигнал-слот? у меня выдает следующее сообщение ASSERT failure in...

Передача данных между потоками
Изучаю многопоточные приложения. Есть 2 потока, в основном окне есть поле ввода, надо как-то передать информацию из поля во второй поток....

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

Передача данных между потоками/процессами
Ребят, у вас тут поактивнее раздел. В соседней ветке .NET я не нашел решения, может java-программисты знают как лучше сделать. Суть...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru