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

Параллельные потоки, вектора, переменные - C++

Восстановить пароль Регистрация
 
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.01.2013, 13:58     Параллельные потоки, вектора, переменные #1
Если у меня работают 2-3 параллельных потока и у всех есть доступ к одному классу.

1) нужно ли лочить этот класс на время работы в одном потоке, что бы остальные не могли к нему обращаться в это время?
2) что будет, если в вектор одновременно кладется 2 переменных в конец или одна кладется в конец, а другая удаляется с начала?
3) если лочить нужно, то как лучше это организовать? Просто дополнительную bool переменную?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2013, 13:58     Параллельные потоки, вектора, переменные
Посмотрите здесь:

Дан список, элементы которого являются координатами вектора. Найти длину вектора C++
Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А C++
Определить количество положительных элементов вектора С(10) и заменить этим значением минимальный элемент вектора А(5) C++
C++ Параллельные потоки
STL. Функция, которая будет искать элементы большее среднего арифметического вектора и удалять их из вектора C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
28.01.2013, 14:13     Параллельные потоки, вектора, переменные #2
Цитата Сообщение от Kgfq Посмотреть сообщение
одному классу
ну наверное не к классу а к объекту, ну и для подобных задач существуют "готовые" решения вроде мютекса или семафора, да и в интернетах полно инфы на данную тему.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
28.01.2013, 14:15     Параллельные потоки, вектора, переменные #3
Цитата Сообщение от Kgfq Посмотреть сообщение
1) нужно ли лочить этот класс на время работы в одном потоке, что бы остальные не могли к нему обращаться в это время?
лочить нужно секции, где производится доступ к общим данным. Если класс (объект) является таким, то нужно операции с ним закрывать залочками.
Цитата Сообщение от Kgfq Посмотреть сообщение
2) что будет, если в вектор одновременно кладется 2 переменных в конец или одна кладется в конец, а другая удаляется с начала?
Если одновременно в 2 потоках без залочек, то результат неопределен.
Цитата Сообщение от Kgfq Посмотреть сообщение
3) если лочить нужно, то как лучше это организовать? Просто дополнительную bool переменную?
смотри про: mutex, semaphore, critical section, event, conditional variable ...
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.01.2013, 14:19  [ТС]     Параллельные потоки, вектора, переменные #4
dederkay, да-да, имел ввиду объект класса. Благодарю

Добавлено через 1 минуту
Почитал про мьютексы, как я понял - это bool, который как раз-таки не дает другим потокам влиять на залоченную переменную. Но что, если когда переменная не залочена, ее захватят 2 потока одновременно?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
28.01.2013, 14:22     Параллельные потоки, вектора, переменные #5
Цитата Сообщение от Kgfq Посмотреть сообщение
Почитал про мьютексы, как я понял - это bool
Это что-то типа переключателя. если 2 одновременно попытаются захватить, то захватит только один, а второй будет ждать пока первый не отпустит.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.01.2013, 14:25  [ТС]     Параллельные потоки, вектора, переменные #6
villu, так если 2 одновременно захватят, то оба и пройдут.

Поток 1:
b = false;

Поток 2:
while(b);
b = true;
// сюда войдет

Поток 3:
while(b);
b = true;
// и сюда войдет
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
28.01.2013, 14:26     Параллельные потоки, вектора, переменные #7
Цитата Сообщение от Kgfq Посмотреть сообщение
ее захватят 2 потока одновременно?
как вам уже сказали, результат неопределим так просто, всё зависит от того что реально происходит, вот напрмер когда у нас только одно ядно то идет имитация многопоточности и тогда бывало так что, мы просто теряем память(например дважды выделив память не сохранив указатель), или же получаем ексепшен, да и ваще всё зависит от конкретного случая. Нельзя гарантировать стабильной работы.
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,208
Записей в блоге: 11
28.01.2013, 14:31     Параллельные потоки, вектора, переменные #8
Цитата Сообщение от Kgfq Посмотреть сообщение
так если 2 одновременно захватят, то оба и пройдут.
Средства синхронизации используют понятие атомарная операция
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
28.01.2013, 14:46     Параллельные потоки, вектора, переменные #9
Цитата Сообщение от Kgfq Посмотреть сообщение
так если 2 одновременно захватят, то оба и пройдут.
яж сказал, что mutex это не совсем булевая переменная. Это объект, механизм. и в твоем примере даже близко не мьютекс.

Все выглядит примерно так:
C++
1
2
3
4
5
6
7
8
9
10
vector<int> data;
mutex data_lock;
 
...// thread code
{
  data_lock.lock();
  data.push_back(...);
   ...
  data_lock.unlock();
}
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.01.2013, 15:08  [ТС]     Параллельные потоки, вектора, переменные #10
Я гуглил, но ничего найти не удалось. Что делает mutex::try_lock?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
28.01.2013, 15:10     Параллельные потоки, вектора, переменные #11
Цитата Сообщение от Kgfq Посмотреть сообщение
try_lock
http://en.cppreference.com/w/cpp/thread/mutex/try_lock
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.01.2013, 15:15  [ТС]     Параллельные потоки, вектора, переменные #12
villu, т.е. lock усыпляет поток до разблокировки, а try_lock лишь возвращает false в случае заблокированности, но не усыпляет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2013, 17:22     Параллельные потоки, вектора, переменные
Еще ссылки по теме:

Составить главную программу и функцию. Для данного вектора А(М) найти количество неповторяющихся элементов вектора C++
C++ Создать программу обработки массивов структур используя структурные переменные и переменные типа объеденения
C++ OPENmp параллельные потоки QT

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

Или воспользуйтесь поиском по форуму:
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
28.01.2013, 17:22     Параллельные потоки, вектора, переменные #13
ну не совсем усыпляет. Хотя можно и так выразиться. Вызов lock ждет, пока мьютекс не станет свободным. Потом сам его хватает и ждут все остальные.
Yandex
Объявления
28.01.2013, 17:22     Параллельные потоки, вектора, переменные
Ответ Создать тему
Опции темы

Текущее время: 13:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru