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

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

Войти
Регистрация
Восстановить пароль
 
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
#1

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

28.01.2013, 13:58. Просмотров 773. Ответов 12
Метки нет (Все метки)

Если у меня работают 2-3 параллельных потока и у всех есть доступ к одному классу.

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

Параллельные потоки - C++
Может кто-нибудь подсказать, как написать программу, в которой с какой-то определенной точки работают параллельно, например, три потока?...

OPENmp параллельные потоки QT - C++
#include <iostream> #include "omp.h" using namespace std; int main() { #pragma omp parallel { ...

Заменить в коде параллельные главной, на параллельные побочной диагонали - C++
Вот код,нужно сделать чтобы сортировались диагонали параллельные побочной, а не главной. помогите пожалуйста. int *diag1; diag1...

разбивка функции на параллельные потоки - C++
В наличии - последовательная функция нахождения обратной матрицы методом Гаусса-Жордана, написанная в Dev-Cpp. Задача состоит в том чтобы...

Что такое потоки ввода, потоки вывода? - C++
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..! вот допустим...

Создать программу обработки массивов структур используя структурные переменные и переменные типа объеденения - C++
Создать массив структур, каждая из которых состоит из следующих елементов: факультет, курс, группа, фамилия студента и екзаменационная...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
28.01.2013, 14:13 #2
Цитата Сообщение от Kgfq Посмотреть сообщение
одному классу
ну наверное не к классу а к объекту, ну и для подобных задач существуют "готовые" решения вроде мютекса или семафора, да и в интернетах полно инфы на данную тему.
1
villu
203 / 204 / 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 ...
1
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.01.2013, 14:19  [ТС] #4
dederkay, да-да, имел ввиду объект класса. Благодарю

Добавлено через 1 минуту
Почитал про мьютексы, как я понял - это bool, который как раз-таки не дает другим потокам влиять на залоченную переменную. Но что, если когда переменная не залочена, ее захватят 2 потока одновременно?
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
28.01.2013, 14:22 #5
Цитата Сообщение от Kgfq Посмотреть сообщение
Почитал про мьютексы, как я понял - это bool
Это что-то типа переключателя. если 2 одновременно попытаются захватить, то захватит только один, а второй будет ждать пока первый не отпустит.
0
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;
// и сюда войдет
0
dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
28.01.2013, 14:26 #7
Цитата Сообщение от Kgfq Посмотреть сообщение
ее захватят 2 потока одновременно?
как вам уже сказали, результат неопределим так просто, всё зависит от того что реально происходит, вот напрмер когда у нас только одно ядно то идет имитация многопоточности и тогда бывало так что, мы просто теряем память(например дважды выделив память не сохранив указатель), или же получаем ексепшен, да и ваще всё зависит от конкретного случая. Нельзя гарантировать стабильной работы.
0
Dmitriy_M
1349 / 1230 / 114
Регистрация: 20.03.2009
Сообщений: 4,420
Записей в блоге: 11
28.01.2013, 14:31 #8
Цитата Сообщение от Kgfq Посмотреть сообщение
так если 2 одновременно захватят, то оба и пройдут.
Средства синхронизации используют понятие атомарная операция
0
villu
203 / 204 / 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();
}
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.01.2013, 15:08  [ТС] #10
Я гуглил, но ничего найти не удалось. Что делает mutex::try_lock?
0
villu
203 / 204 / 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
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.01.2013, 15:15  [ТС] #12
villu, т.е. lock усыпляет поток до разблокировки, а try_lock лишь возвращает false в случае заблокированности, но не усыпляет?
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
28.01.2013, 17:22 #13
ну не совсем усыпляет. Хотя можно и так выразиться. Вызов lock ждет, пока мьютекс не станет свободным. Потом сам его хватает и ждут все остальные.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2013, 17:22
Привет! Вот еще темы с ответами:

Найти сколько элементов первого вектора совпадают с элементами второго вектора - C++
#include &lt;iostream&gt; #include &lt;time.h&gt; #include &lt;vector&gt; #include &lt;set&gt; using namespace std; void main() { ...

Дан список, элементы которого являются координатами вектора. Найти длину вектора - C++
1. Дан список, элементы которого являются координатами вектора в n-мерном пространстве. Найти длину вектора.

Определить количество положительных элементов вектора С(10) и заменить этим значением минимальный элемент вектора А(5) - C++
Ребята помогите пожалуйста с задачкой. Я сам не шарю в C++, но в этом семестре появился этот предмет! И завтра его надо будет сдать :( Буду...

Ошибка с итераторами для целочисленного вектора и вектора структуры - C++
Пытаюсь разобраться с векторами. Для динамической работы с памятью вещь, вроде, замечательная и удобная. Только необходимо использовать...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.01.2013, 17:22
Ответ Создать тему
Опции темы

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