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

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

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
#1

Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера? - C++

12.02.2012, 15:11. Просмотров 803. Ответов 6
Метки нет (Все метки)

Начать с массивов, допустим
То есть ситуация такая: пусть имеется два потока и глобальный массив элементов int из двух элементов, один поток выводит в цикле значение нулевого элемента, а второй- значение первого; вот сижу думаю- могут ли они перепутать элементы?

С одной стороны не могут потому как обращение к элементу по индексу однозначаено идентифицирует этот элемент; а с другой стороны, кто его знает, как на уровне ассемблера это реализовано?

Да, естессно, речь пока не идёт об использовании мьютексов или других средств синхронизации.
(А потом когда разберёмся с массивами можно будет перейти на более сложные контейнеры, словари там множества и прочая)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2012, 15:11     Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера?
Посмотрите здесь:

Ввод в массив элементы другого массива. C++
Локальный или глобальный массив векторов C++
C++ Дано два целочисленных массива Сформировать новый массив, который содержит элементы первого массива, которых нет во втором
Массив: Сформировать массив С, содержащий те элементы массива А, имеющие значения кратные М, которые есть в массиве В. C++
C++ Проверка. Все ли элементы массива имеют то или иное значение(всего их два)
C++ Массив-ссылка на некоторые элементы другого массива
C++ Дан массив. Найти в нем глобальный минимум или максимум
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1744 / 1087 / 71
Регистрация: 13.09.2011
Сообщений: 3,111
12.02.2012, 16:07     Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера? #2
Два потока используют две разных переменных, могут ли они перепутать элементы?

С одной стороны не могут потому как обращение к переменной однозначаено идентифицирует этот элемент; а с другой стороны, кто его знает, как на уровне ассемблера это реализовано?
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
12.02.2012, 19:15     Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера? #3
могут, если третий поток поменяет значения этих элементов
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
12.02.2012, 19:24  [ТС]     Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера? #4
Нет, без всяких третьих потоков, только два потока рассматриваем.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
12.02.2012, 21:33     Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера? #5
если размер массива не изменяется - ничего не перепутается.

Добавлено через 1 минуту
и вообще на этот счет существует правило: доступ к общим данным безопасен до тех пор, пока эти данные только читаются.

другими словами, если как-то другой поток начнет изменять данные, тогда UB.
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
13.02.2012, 01:30     Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера? #6
будь оно иначе... думаю мультипоточность не имела бы никакого реального применения. ни во что верить нельзя было бы)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2012, 12:56     Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера?
Еще ссылки по теме:

C++ Записать в массив элементы другого массива
C++ Сравнить поэлементно два одномерных массива, и через if определить, равны эти элементы или нет
Потоки, static. Доступ к полю класса из другого потока C++
Дано два одномерных массива, создать третий массив который содержит элементы первого массива C++
C++ Разделить элементы одного массива на элементы другого массива, записать результат в третий массив

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
13.02.2012, 12:56  [ТС]     Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера? #7
Будь оно иначе, всё решалось бы средствами синхронизации, так что мультипоточность всё-таки какое-никакое применение имела бы. Но в одном вы правы- из-за такого маленького вопроса не стоило и огород городить. Пойдём дальше- если каждый поток изменяет соответствующий ему элемент массива. И сразу же: если мы имеем дело не с массивом, а, допустим, со словарём?
C++
1
2
3
4
map<char,int> first;
 
  first['a']=10;
  first['b']=30;
Допустим один поток изменяет
first['a'], а второй first['b'], могут ли они перепутать элементы?
Yandex
Объявления
13.02.2012, 12:56     Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера?
Ответ Создать тему
Опции темы

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