|
|
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
Надо изменить массив, причём сделать изменения требуется вне зависимости от значений элементов массива (просто добавлять к определённым членам массива определённые извне значения, которые не зависят от массива). Надо ли использовать критические секции или что-то ещё или же при таких операциях в этом нет необходимости? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 00:06 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
ayvango, Это зависит от волнующих подробностей, которые ты не указал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 11:35 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
зависит от того, будут ли одновременно потоки обращаться к разным элементам массива, или же вполне могут к одним и тем же. Если первое, то можешь не синхронизировать потоки. Если второе, то зависит от волнующих подробностей, которые ты не указал ;) Например, если потоки могут одновременно писать в один элемент, то однозначно нужна та или иная синхронизация, если один пишет, а другие читают, то в зависимости от типа данных в массиве нужно (или не нужно) синхронизировать потоки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 11:51 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
Нужно знать масштабы задачи. Сколько будет потоков. Каков размер массива. (приблизительно). Просто глупо вешать мутекс на каждый элемент массива (если это биткарта). Нужно как-то мыслить количественными оценками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 13:07 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 13:56 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
Добавлять -- арифметически складывать. Размер массива -- 100 М элементов. Тип элементов -- double. Я так понял, стоит задуматься над тем, как разным потокам поставить во взаимнооднозначное соответствие разные элементы, чтобы только один поток изменял один элемент, тогда не требуется никакой синхронизации, верно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 17:24 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
число потоков -- 4-20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 17:25 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
ayvango, в точку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 17:25 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
член массивазависит от того, будут ли одновременно потоки обращаться к разным элементам массива, или же вполне могут к одним и тем же. Если первое, то можешь не синхронизировать потоки. Если второе, то зависит от волнующих подробностей, которые ты не указал ;) Например, если потоки могут одновременно писать в один элемент, то однозначно нужна та или иная синхронизация, если один пишет, а другие читают, то в зависимости от типа данных в массиве нужно (или не нужно) синхронизировать потоки. Зависит в первую очередь от того, что такое "массив", я бы сказал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 19:13 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
член массива...если один пишет, а другие читают, то в зависимости от типа данных в массиве нужно (или не нужно) синхронизировать потоки. Ошибаешься, в таком случае также безусловно нужна синхронизация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 19:14 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
maytonНужно знать масштабы задачи. Сколько будет потоков. Каков размер массива. (приблизительно). Просто глупо вешать мутекс на каждый элемент массива (если это биткарта). Нужно как-то мыслить количественными оценками. Зачем на каждый ? НА весь массив вешать надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 19:14 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 20:04 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
конкурентное добавлениеЕсли же все равно иногда могут разные потоки обращаться к разным одним и тем же элементам массива ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 20:05 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
MasterZivчлен массива...если один пишет, а другие читают, то в зависимости от типа данных в массиве нужно (или не нужно) синхронизировать потоки.Ошибаешься, в таком случае также безусловно нужна синхронизация.Не ошибаюсь. Если элементы являются простыми типами (32-х битное, например), то один поток может менять что хочет и как хочет, при том что другие потоки могут читать эти изменяемые элементы без синхронизации. Если же тип данных сложен и для него не существует атомарной операции для записи изменения в память (тот же double на 32-х битных системах и при размере структуры 8 байт будет записываться в элемент массива за два приема - первые 32 бита, затем вторые), то тут да, читающие потоки могут словить "полуготовое" значение, не являющееся ни старым, ни новым значением элемента, тут обязательно нужно синхронизировать читателей с писателем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 22:06 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
член массиваMasterZivпропущено... Ошибаешься, в таком случае также безусловно нужна синхронизация.Не ошибаюсь. Если элементы являются простыми типами (32-х битное, например), то один поток может менять что хочет и как хочет, при том что другие потоки могут читать эти изменяемые элементы без синхронизации. Если же тип данных сложен и для него не существует атомарной операции для записи изменения в память (тот же double на 32-х битных системах и при размере структуры 8 байт будет записываться в элемент массива за два приема - первые 32 бита, затем вторые), то тут да, читающие потоки могут словить "полуготовое" значение, не являющееся ни старым, ни новым значением элемента, тут обязательно нужно синхронизировать читателей с писателем. Помимо проблемы полуготовых данных, есть ещё проблема переупорядочивания компилятором, конвейером и кэшом - так что в зависимости от задачи могут понадобиться и барьеры памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2013, 22:42 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
MasterZivmaytonНужно знать масштабы задачи. Сколько будет потоков. Каков размер массива. (приблизительно). Просто глупо вешать мутекс на каждый элемент массива (если это биткарта). Нужно как-то мыслить количественными оценками. Зачем на каждый ? НА весь массив вешать надо. А может разбить на блоки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 01:17 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
член массиваMasterZivпропущено... Ошибаешься, в таком случае также безусловно нужна синхронизация.Не ошибаюсь. Если элементы являются простыми типами (32-х битное, например), то один поток может менять что хочет и как хочет, при том что другие потоки могут читать эти изменяемые элементы без синхронизации. Если же тип данных сложен и для него не существует атомарной операции для записи изменения в память (тот же double на 32-х битных системах и при размере структуры 8 байт будет записываться в элемент массива за два приема - первые 32 бита, затем вторые), то тут да, читающие потоки могут словить "полуготовое" значение, не являющееся ни старым, ни новым значением элемента, тут обязательно нужно синхронизировать читателей с писателем. Это расхожее заблуждение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 08:09 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
И ещё вопрос: Если я пишу 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, после чего запустил бы их. Почему это происходит и как этого избежать, если надо создавать много потоков? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 08:15 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
MasterZivЭто расхожее заблуждение.На x86 - можно, в общем случае - нет. Ок? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 08:22 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
MasterZivчлен массивапропущено... Не ошибаюсь. Это расхожее заблуждение. Теоретик детектед ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 09:26 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
?MasterZivЭто расхожее заблуждение.На x86 - можно, в общем случае - нет. Ок? Можно на чём-то типа i80286/386 . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 10:25 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
MasterZiv?пропущено... На x86 - можно, в общем случае - нет. Ок?Можно на чём-то типа i80286/386 . Считающие себя умными - такие считающие За весь топик лишь свои никчемные и неверные оценки: "Это верно, это неверно" и ничего больше) Царь-судья?) Или знаний 0 и по делу сказать нечего, а хочется набрать посты?)) Охохошеньки) Хотя.. у каждого свой путь к успеху) Ну а ТСу удачи в нелегком деле освоения многопоточности!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 10:48 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
член массива, По делу я сказал всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 11:22 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
MasterZivПо делу я сказал всё. И даже не упомянул про выравнивание.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 12:11 |
|
||
|
вопрос по потокам
|
|||
|---|---|---|---|
|
#18+
MasterZiv?пропущено... На x86 - можно, в общем случае - нет. Ок? Можно на чём-то типа i80286/386 .На x86 не могут быть переупорядочены два чтения из памяти. Не могут быть переупорядочены две записи в память. Запись ниже по коду не может быть выполнена до чтения выше по коду. Чтение ниже по коду МОЖЕТ быть выполнено раньше записи в другой адрес выше по коду. Очень мало сценариев, где такое переупорядочение может вызвать проблему. Да, есть алгоритм Деккера , но реально его вряд ли кто-то использует при наличии атомарных обменов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2013, 21:26 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38326764&tid=1341734]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
394ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 700ms |

| 0 / 0 |
