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

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

07.06.2019, 10:42. Показов 7932. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru