Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / вопрос по потокам / 25 сообщений из 34, страница 1 из 2
10.07.2013, 00:06
    #38326153
ayvango
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
Надо изменить массив, причём сделать изменения требуется вне зависимости от значений элементов массива (просто добавлять к определённым членам массива определённые извне значения, которые не зависят от массива). Надо ли использовать критические секции или что-то ещё или же при таких операциях в этом нет необходимости?
...
Рейтинг: 0 / 0
10.07.2013, 11:35
    #38326487
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
ayvango,

Это зависит от волнующих подробностей, которые ты не указал.
...
Рейтинг: 0 / 0
10.07.2013, 11:51
    #38326519
вопрос по потокам
зависит от того, будут ли одновременно потоки обращаться к разным элементам массива, или же вполне могут к одним и тем же. Если первое, то можешь не синхронизировать потоки. Если второе, то зависит от волнующих подробностей, которые ты не указал ;) Например, если потоки могут одновременно писать в один элемент, то однозначно нужна та или иная синхронизация, если один пишет, а другие читают, то в зависимости от типа данных в массиве нужно (или не нужно) синхронизировать потоки.
...
Рейтинг: 0 / 0
10.07.2013, 13:07
    #38326673
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
Нужно знать масштабы задачи. Сколько будет потоков. Каков размер массива. (приблизительно).
Просто глупо вешать мутекс на каждый элемент массива (если это биткарта). Нужно как-то
мыслить количественными оценками.
...
Рейтинг: 0 / 0
10.07.2013, 13:56
    #38326764
вопрос по потокам
ayvangoНадо изменить массив, причём сделать изменения требуется вне зависимости от значений элементов массива ( просто добавлять к определённым членам массива определённые извне значения, которые не зависят от массива). Надо ли использовать критические секции или что-то ещё или же при таких операциях в этом нет необходимости?
Что значит добавлять, арифметически складывать?

Для примера конкурентное добавление из разных потоков к элементу массива с индексом 10:
Код: plaintext
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.
#include<iostream>
#include<atomic>
#include<thread>
#include<array>
#include<vector>

std::array< std::atomic<int>, 1024*1024 > atomic_array;

int main() {
    for(auto &i : atomic_array) i.store(0, std::memory_order_relaxed);

	std::vector<std::thread> t_grp(std::thread::hardware_concurrency());
	for(auto &i : t_grp) i.swap(std::thread([](){
							for(size_t i = 0; i < 10000000; ++i)
								atomic_array[10].fetch_add(1, std::memory_order_relaxed);
						} ));
	for(auto &i : t_grp) i.join();

	std::cout << "std::thread::hardware_concurrency() = " << std::thread::hardware_concurrency() << std::endl;
	std::cout << "atomic_array[10] = " << atomic_array[10] << std::endl;

    int b;
	std::cin >> b;
    return 0;
}
...
Рейтинг: 0 / 0
10.07.2013, 17:24
    #38327142
ayvango
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
Добавлять -- арифметически складывать.
Размер массива -- 100 М элементов. Тип элементов -- double.
Я так понял, стоит задуматься над тем, как разным потокам поставить во взаимнооднозначное соответствие разные элементы, чтобы только один поток изменял один элемент, тогда не требуется никакой синхронизации, верно?
...
Рейтинг: 0 / 0
10.07.2013, 17:25
    #38327144
ayvango
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
число потоков -- 4-20.
...
Рейтинг: 0 / 0
10.07.2013, 17:25
    #38327145
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
ayvango, в точку.
...
Рейтинг: 0 / 0
10.07.2013, 19:13
    #38327303
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
член массивазависит от того, будут ли одновременно потоки обращаться к разным элементам массива, или же вполне могут к одним и тем же. Если первое, то можешь не синхронизировать потоки. Если второе, то зависит от волнующих подробностей, которые ты не указал ;) Например, если потоки могут одновременно писать в один элемент, то однозначно нужна та или иная синхронизация, если один пишет, а другие читают, то в зависимости от типа данных в массиве нужно (или не нужно) синхронизировать потоки.


Зависит в первую очередь от того, что такое "массив", я бы сказал...
...
Рейтинг: 0 / 0
10.07.2013, 19:14
    #38327304
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
член массива...если один пишет, а другие читают, то в зависимости от типа данных в массиве нужно (или не нужно) синхронизировать потоки.


Ошибаешься, в таком случае также безусловно нужна синхронизация.
...
Рейтинг: 0 / 0
10.07.2013, 19:14
    #38327305
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
maytonНужно знать масштабы задачи. Сколько будет потоков. Каков размер массива. (приблизительно).
Просто глупо вешать мутекс на каждый элемент массива (если это биткарта). Нужно как-то
мыслить количественными оценками.

Зачем на каждый ? НА весь массив вешать надо.
...
Рейтинг: 0 / 0
10.07.2013, 20:04
    #38327346
вопрос по потокам
ayvangoДобавлять -- арифметически складывать.
Размер массива -- 100 М элементов. Тип элементов -- double.
Я так понял, стоит задуматься над тем, как разным потокам поставить во взаимнооднозначное соответствие разные элементы, чтобы только один поток изменял один элемент , тогда не требуется никакой синхронизации, верно?
Если это можно, то конечно нужно!
А ещё лучше в такой ситуации в каждом потоке иметь свой локальный массив.

Если же все равно иногда могут разные потоки обращаться к разным элементам массива, то по аналогии:
Код: plaintext
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.
#include<iostream>
#include<atomic>
#include<thread>
#include<array>
#include<vector>

std::array< std::atomic<double>, 1024*1024 > atomic_array;

int main() {
    for(auto &i : atomic_array) i.store(0, std::memory_order_relaxed);

	std::vector<std::thread> t_grp(std::thread::hardware_concurrency());
	for(auto &i : t_grp) i.swap(std::thread([](){
							for(size_t i = 0; i < 10000000; ++i)
								atomic_array[10].fetch_add(1, std::memory_order_relaxed);
						} ));
	for(auto &i : t_grp) i.join();

	std::cout << "std::thread::hardware_concurrency() = " << std::thread::hardware_concurrency() << std::endl;
	std::cout << "atomic_array[10] = " << atomic_array[10] << std::endl;

    int b;
	std::cin >> b;
    return 0;
}
...
Рейтинг: 0 / 0
10.07.2013, 20:05
    #38327347
вопрос по потокам
конкурентное добавлениеЕсли же все равно иногда могут разные потоки обращаться к разным одним и тем же элементам массива
...
Рейтинг: 0 / 0
10.07.2013, 22:06
    #38327416
вопрос по потокам
MasterZivчлен массива...если один пишет, а другие читают, то в зависимости от типа данных в массиве нужно (или не нужно) синхронизировать потоки.Ошибаешься, в таком случае также безусловно нужна синхронизация.Не ошибаюсь. Если элементы являются простыми типами (32-х битное, например), то один поток может менять что хочет и как хочет, при том что другие потоки могут читать эти изменяемые элементы без синхронизации. Если же тип данных сложен и для него не существует атомарной операции для записи изменения в память (тот же double на 32-х битных системах и при размере структуры 8 байт будет записываться в элемент массива за два приема - первые 32 бита, затем вторые), то тут да, читающие потоки могут словить "полуготовое" значение, не являющееся ни старым, ни новым значением элемента, тут обязательно нужно синхронизировать читателей с писателем.
...
Рейтинг: 0 / 0
10.07.2013, 22:42
    #38327438
вопрос по потокам
член массиваMasterZivпропущено...
Ошибаешься, в таком случае также безусловно нужна синхронизация.Не ошибаюсь. Если элементы являются простыми типами (32-х битное, например), то один поток может менять что хочет и как хочет, при том что другие потоки могут читать эти изменяемые элементы без синхронизации. Если же тип данных сложен и для него не существует атомарной операции для записи изменения в память (тот же double на 32-х битных системах и при размере структуры 8 байт будет записываться в элемент массива за два приема - первые 32 бита, затем вторые), то тут да, читающие потоки могут словить "полуготовое" значение, не являющееся ни старым, ни новым значением элемента, тут обязательно нужно синхронизировать читателей с писателем.
Помимо проблемы полуготовых данных, есть ещё проблема переупорядочивания компилятором, конвейером и кэшом - так что в зависимости от задачи могут понадобиться и барьеры памяти.
...
Рейтинг: 0 / 0
11.07.2013, 01:17
    #38327506
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
MasterZivmaytonНужно знать масштабы задачи. Сколько будет потоков. Каков размер массива. (приблизительно).
Просто глупо вешать мутекс на каждый элемент массива (если это биткарта). Нужно как-то
мыслить количественными оценками.

Зачем на каждый ? НА весь массив вешать надо.
А может разбить на блоки?
...
Рейтинг: 0 / 0
11.07.2013, 08:09
    #38327570
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
член массиваMasterZivпропущено...
Ошибаешься, в таком случае также безусловно нужна синхронизация.Не ошибаюсь. Если элементы являются простыми типами (32-х битное, например), то один поток может менять что хочет и как хочет, при том что другие потоки могут читать эти изменяемые элементы без синхронизации. Если же тип данных сложен и для него не существует атомарной операции для записи изменения в память (тот же double на 32-х битных системах и при размере структуры 8 байт будет записываться в элемент массива за два приема - первые 32 бита, затем вторые), то тут да, читающие потоки могут словить "полуготовое" значение, не являющееся ни старым, ни новым значением элемента, тут обязательно нужно синхронизировать читателей с писателем.

Это расхожее заблуждение.
...
Рейтинг: 0 / 0
11.07.2013, 08:15
    #38327572
ayvango
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
И ещё вопрос: Если я пишу

Thread[] t = new Thread[4];
for (int i = 0; i < 4; ++i)
{
t[i] = new Thread(() => { for (int j = i; j < N; j += core) temp += f(j); });
}

for (int i = 0; i < 4; ++i) t[i].Start();

, то выполняется дольше, чем если бы я создал отдельно 4 потока без использования массива t, после чего запустил бы их.

Почему это происходит и как этого избежать, если надо создавать много потоков?
...
Рейтинг: 0 / 0
11.07.2013, 08:22
    #38327579
?
?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
MasterZivЭто расхожее заблуждение.На x86 - можно, в общем случае - нет. Ок?
...
Рейтинг: 0 / 0
11.07.2013, 09:26
    #38327647
вопрос по потокам
MasterZivчлен массивапропущено...
Не ошибаюсь.
Это расхожее заблуждение.
Теоретик детектед
...
Рейтинг: 0 / 0
11.07.2013, 10:25
    #38327746
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
?MasterZivЭто расхожее заблуждение.На x86 - можно, в общем случае - нет. Ок?

Можно на чём-то типа i80286/386 .
...
Рейтинг: 0 / 0
11.07.2013, 10:48
    #38327789
вопрос по потокам
MasterZiv?пропущено...
На x86 - можно, в общем случае - нет. Ок?Можно на чём-то типа i80286/386 .
Считающие себя умными - такие считающие
За весь топик лишь свои никчемные и неверные оценки: "Это верно, это неверно" и ничего больше) Царь-судья?) Или знаний 0 и по делу сказать нечего, а хочется набрать посты?)) Охохошеньки) Хотя.. у каждого свой путь к успеху)

Ну а ТСу удачи в нелегком деле освоения многопоточности!)
...
Рейтинг: 0 / 0
11.07.2013, 11:22
    #38327840
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
член массива,

По делу я сказал всё.
...
Рейтинг: 0 / 0
11.07.2013, 12:11
    #38327925
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
MasterZivПо делу я сказал всё.
И даже не упомянул про выравнивание..
...
Рейтинг: 0 / 0
11.07.2013, 21:26
    #38328726
?
?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по потокам
MasterZiv?пропущено...
На x86 - можно, в общем случае - нет. Ок?

Можно на чём-то типа i80286/386 .На x86 не могут быть переупорядочены два чтения из памяти. Не могут быть переупорядочены две записи в память. Запись ниже по коду не может быть выполнена до чтения выше по коду. Чтение ниже по коду МОЖЕТ быть выполнено раньше записи в другой адрес выше по коду. Очень мало сценариев, где такое переупорядочение может вызвать проблему. Да, есть алгоритм Деккера , но реально его вряд ли кто-то использует при наличии атомарных обменов.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / вопрос по потокам / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]