
Mike
11.06.2017
12:56:25
народ подскажите каким путём пойти для организации потокобезопасных классов, что использовать task c++11, OpenMP, Microsoft PPL, или ещё что порыть

Surreal
11.06.2017
13:00:51
Если задача легко решается тем, что есть в стандартной либе, то, естественно, лучше использовать ее. Только не используйте std::async, с остальным проблем там нет.

Mike
11.06.2017
13:02:15
async я читал что много на неё ругаются но не копал особо бо ней, так что не предовал ей внимание

Дед Пегас
11.06.2017
13:03:17

Google

Surreal
11.06.2017
13:10:36
А что с асинк?
Если вам раз в минуту или реже надо что-то сделать асинхронно, то ничего особо страшного нет. В остальных случаях лучше написать свой\взять готовый планировщик\очередь с пулом, т.к. для std::async не указан способ выбора потока для исполнения и, например, в винде это, вроде, пул потоков по количеству потоков процессора, а в линуксе это просто новый поток на каждый вызов. И для запуска всего 2 политики, а политика по-умолчанию не указана.

Mike
11.06.2017
13:12:46
думаю каким путём пойти... использовать систему сообщений между классами или писать что либо другое

Surreal
11.06.2017
13:15:38
Найдите среди открытых проектов что-нибудь похожее на вашу задачу и посмотрите, как там реализовано.
Если классы дожны знать какой-то общий POD статус, то можно std::atomic использовать, если должны ждать статус, то добавить std::condition_variable.

Square
11.06.2017
13:21:33

Mike
11.06.2017
13:32:58
если в краце то взял за основу организацию классов в Unty3D и формирую классы подобным образом, но в юнити нет поддержки обработки классов из разных потоков, в силу многих обстоятельств... все работы связанные с основными классами должны выполняться в основном потоке... хотелось бы попробывать организовать что то подобное но с возможностью общей связью с классами... так же в юнити есть организация связей через сообщения...
вот и думаю стоит поробывать или однопоточный способ организовать но так чтобы легко расширялось на будущее

desu
11.06.2017
13:36:08
Многопоточный 3д движек

Mike
11.06.2017
13:36:22
сам юнити написан на плюсах а шарпы всеголоишь образуют обёртку над функционалом плюсов
фреймворк ))

desu
11.06.2017
13:37:44
Наверное все общение между потоков нивелирует все хорошее что можно получить

Square
11.06.2017
13:38:19
Я все ещё не понял задачу решаемую

Google

Square
11.06.2017
13:39:17
Классы просто должны быть потокобезопасны?
Или их инстансы будут меняться инфой?

Mike
11.06.2017
13:39:59
если знаете то в юнити цикл обработки gameObject'ов проходит по его компонентам и вот тут т.к. GO по сути являются независимыми объектами можно организовать паралельность обработки.(за исключением если есть чёткая цепочка выполнения GO)

Square
11.06.2017
13:40:07
В первом случае - обложить барьерами на запись/чтение
Самый быстрый вариант

Mike
11.06.2017
13:41:55
т.е выполняем строго описанный цикл обработки GO 1,2... n. А остальные GO по сути можно выполнить хаотично( но тут проблемы в пользовании общими ресурсами)
либо организовать некий пул с орзанизацией доступа по сообщениями либо хз

Square
11.06.2017
13:43:44
Некий пул либо хз :)

Mike
11.06.2017
13:43:48
пока варианты перебираю, решил спросить есть ли варианты у вас

Surreal
11.06.2017
13:44:35
Если я правильно понял, то необходимо параллельно обрабатывать игровые объекты. Т.к. один объект сразу в 2х потоках обрабатывать скорее всего нельзя, то создать просто пул, куда кидать задачу и объект.

Square
11.06.2017
13:44:46
Если есть куча объектов и их надо обработать - то map парадигма - то что надо

Surreal
11.06.2017
13:46:09

Square
11.06.2017
13:46:48
На локи все время уйдёт
А если оно ещё и в кэш не влезет
Или не дай бог влезет
Хз чо страшнее

Mike
11.06.2017
13:47:49
сама по себе заадача интересная, может я сильно копнул ))

Surreal
11.06.2017
13:47:52

Google

Square
11.06.2017
13:48:51

Mike
11.06.2017
13:50:09
[In reply to Mike Gamaev]
Ну если бы ещё представлять цель...
Что именно объяснить?

Surreal
11.06.2017
13:50:54
Вообще в играх стараются обрабатывать однотипные объекты одной пачкой в одном потоке, чтобы и параллельно и от кэша выигрыш получить. Т.е. делают планировщик, куда кидают вектор объектов и их обработчик с приоритетом.

Square
11.06.2017
13:51:39
Всегда за него тут топлю

Mike
11.06.2017
13:54:49
я завис.. )) пытаюсь понять о чём речь

Square
11.06.2017
13:56:40
я завис.. )) пытаюсь понять о чём речь
Для скорости - обработчик должен забирать данные пачками. В вашем случае, если GO хранятся в каком то контейнере - то надо забирать сразу несколько объектов на обработку

Mike
11.06.2017
13:57:25
я смотрю то что скинул в Гите

Square
11.06.2017
13:57:33
А, локфри очередь
Для межпоточного обмена

Square
11.06.2017
13:58:12
Создал инстанс, напихал туда объектов и запустил потоки... все просто

Surreal
11.06.2017
14:01:21
я завис.. )) пытаюсь понять о чём речь
Группируйте одинаковые объекты и обрабатывайте их вместе. Т.е. у вас есть пачка объектов A, к которым надо с заданными интервалами применять метод B. Храните в векторе или деке (условно) все объекты типа А и отдавайте их в планировщик. Можно и планировщик умный написать, который будет не просто всю пачку в одном потоке копать, но, в зависимости от необработанного размера пачки и количества свободных потоков, подключать еще один поток на обработку пачки, пока не придет что-нибудь с более высоким приоритетом. Тут все вашей фантазией ограничивается на самом деле.

Mike
11.06.2017
14:01:23
нужно поруть данные на гите чтобы понять
пытаюсь понять как этим пользоваться
что происходит под копотом

Lazy Ghost
11.06.2017
14:32:04
if (argv[1][i] - !!a != a[i])
Что значат два восклицательных знака?

Mike
11.06.2017
14:33:06
операция перед (!a != a[i])

Google

Никита
11.06.2017
14:35:01

Lazy Ghost
11.06.2017
14:40:16
Не понятно все равно.
Есть массив a[], который содержит строку.
Что проверяет это условие?

Tema
11.06.2017
14:43:12

Никита
11.06.2017
14:43:52
если по нулевому, то без минус один

Lazy Ghost
11.06.2017
14:45:17
Спасибо большое

Никита
11.06.2017
14:45:40
да не за что, если скинешь больше кода, могу предположить, зачем такой хак

Admin
ERROR: S client not available

Lazy Ghost
11.06.2017
14:46:19
Я в личку скину позже, не против?

Никита
11.06.2017
14:46:24
ок

Anton
11.06.2017
14:47:20
Ребят, вопрос такой возинк.
Как обычно поступают компиляторы в ситуации, когда конструкторы копирования попадают в подмножество конструкторов-шаблонов?
Пример:
template<typename T>
class A {
public:
template<template U>
A(const A<U> &a);
template<template U>
A(A<U> &&a);
}

Никита
11.06.2017
14:47:38

Anatoly
11.06.2017
15:45:58
в твоем случае, компилятор сгенерирует конструктор копирования самостоятельно, как если бы ты объявил
A(const A& ) = default;

Anton
11.06.2017
15:47:37

Berkus
11.06.2017
16:07:16

Mike
11.06.2017
18:00:14
а ссылку можно?
И по поводу этого вкраце может ктонибудь объяснить его принцип работы https://github.com/cameron314/concurrentqueue/blob/master/concurrentqueue.h

Artem
11.06.2017
18:08:14

Google

Artem
11.06.2017
18:08:21
ты читал?

Simon
11.06.2017
18:10:03

Artem
11.06.2017
18:10:04
и наверное это должен был быть первый вопрос - ты понимаешь, что такое compare-and-swap (cmpxchg) и вот это все?

Simon
11.06.2017
18:11:13

Artem
11.06.2017
18:12:09
50 пишущих это повод разбить запись на несколько буферов

Simon
11.06.2017
18:13:04
Наверн в худшем случае от количества пишущих зависит

Artem
11.06.2017
18:13:20
с меньшим количеством конкурирующих за запись и конкуренцией буферов за флаш в очередь
от всего зависит, в том числе от удачи-неудачи. тут нет детерминизма

Simon
11.06.2017
18:15:04
неудача это когда первым должен писать, а в итоге последним это делаешь :[

Artem
11.06.2017
18:15:42
неудача это когда система строится на предположении о том, что кто-то первым должен писать

Mike
11.06.2017
18:16:02

Artem
11.06.2017
18:26:17
да

Mike
11.06.2017
18:26:42
ну конечно знаю и

Surreal
11.06.2017
18:37:42

Mike
11.06.2017
18:43:47
с переводчиком не особо понятно
нашёл вот это https://habrahabr.ru/post/245837/
я не знаю неужели только у меня такая понацея пользоваться только теми вещями которые понимаю...