Surreal
А что с асинк?
Если вам раз в минуту или реже надо что-то сделать асинхронно, то ничего особо страшного нет. В остальных случаях лучше написать свой\взять готовый планировщик\очередь с пулом, т.к. для std::async не указан способ выбора потока для исполнения и, например, в винде это, вроде, пул потоков по количеству потоков процессора, а в линуксе это просто новый поток на каждый вызов. И для запуска всего 2 политики, а политика по-умолчанию не указана.
Mikhail
думаю каким путём пойти... использовать систему сообщений между классами или писать что либо другое
Surreal
Найдите среди открытых проектов что-нибудь похожее на вашу задачу и посмотрите, как там реализовано.
Surreal
Если классы дожны знать какой-то общий POD статус, то можно std::atomic использовать, если должны ждать статус, то добавить std::condition_variable.
Mikhail
если в краце то взял за основу организацию классов в Unty3D и формирую классы подобным образом, но в юнити нет поддержки обработки классов из разных потоков, в силу многих обстоятельств... все работы связанные с основными классами должны выполняться в основном потоке... хотелось бы попробывать организовать что то подобное но с возможностью общей связью с классами... так же в юнити есть организация связей через сообщения...
Mikhail
вот и думаю стоит поробывать или однопоточный способ организовать но так чтобы легко расширялось на будущее
rostislav
Многопоточный 3д движек
Mikhail
сам юнити написан на плюсах а шарпы всеголоишь образуют обёртку над функционалом плюсов
Mikhail
фреймворк ))
rostislav
Наверное все общение между потоков нивелирует все хорошее что можно получить
Square
Square
Я все ещё не понял задачу решаемую
Square
Классы просто должны быть потокобезопасны?
Square
Или их инстансы будут меняться инфой?
Mikhail
если знаете то в юнити цикл обработки gameObject'ов проходит по его компонентам и вот тут т.к. GO по сути являются независимыми объектами можно организовать паралельность обработки.(за исключением если есть чёткая цепочка выполнения GO)
Square
В первом случае - обложить барьерами на запись/чтение
Square
Square
Самый быстрый вариант
Mikhail
т.е выполняем строго описанный цикл обработки GO 1,2... n. А остальные GO по сути можно выполнить хаотично( но тут проблемы в пользовании общими ресурсами)
Mikhail
либо организовать некий пул с орзанизацией доступа по сообщениями либо хз
Square
Некий пул либо хз :)
Mikhail
пока варианты перебираю, решил спросить есть ли варианты у вас
Surreal
Если я правильно понял, то необходимо параллельно обрабатывать игровые объекты. Т.к. один объект сразу в 2х потоках обрабатывать скорее всего нельзя, то создать просто пул, куда кидать задачу и объект.
Square
Если есть куча объектов и их надо обработать - то map парадигма - то что надо
Square
Square
На локи все время уйдёт
Square
А если оно ещё и в кэш не влезет
Square
Или не дай бог влезет
Square
Хз чо страшнее
Mikhail
сама по себе заадача интересная, может я сильно копнул ))
Mikhail
[In reply to Mike Gamaev]
Ну если бы ещё представлять цель...
Что именно объяснить?
Surreal
Вообще в играх стараются обрабатывать однотипные объекты одной пачкой в одном потоке, чтобы и параллельно и от кэша выигрыш получить. Т.е. делают планировщик, куда кидают вектор объектов и их обработчик с приоритетом.
Square
Square
Всегда за него тут топлю
Square
Mikhail
я завис.. )) пытаюсь понять о чём речь
Square
я завис.. )) пытаюсь понять о чём речь
Для скорости - обработчик должен забирать данные пачками. В вашем случае, если GO хранятся в каком то контейнере - то надо забирать сразу несколько объектов на обработку
Mikhail
я смотрю то что скинул в Гите
Square
А, локфри очередь
Square
Для межпоточного обмена
Square
Создал инстанс, напихал туда объектов и запустил потоки... все просто
Square
Surreal
я завис.. )) пытаюсь понять о чём речь
Группируйте одинаковые объекты и обрабатывайте их вместе. Т.е. у вас есть пачка объектов A, к которым надо с заданными интервалами применять метод B. Храните в векторе или деке (условно) все объекты типа А и отдавайте их в планировщик. Можно и планировщик умный написать, который будет не просто всю пачку в одном потоке копать, но, в зависимости от необработанного размера пачки и количества свободных потоков, подключать еще один поток на обработку пачки, пока не придет что-нибудь с более высоким приоритетом. Тут все вашей фантазией ограничивается на самом деле.
Mikhail
нужно поруть данные на гите чтобы понять
Mikhail
пытаюсь понять как этим пользоваться
Mikhail
что происходит под копотом
Декодер (лысый)
if (argv[1][i] - !!a != a[i])
Что значат два восклицательных знака?
Mikhail
операция перед (!a != a[i])
Декодер (лысый)
Не понятно все равно.
Есть массив a[], который содержит строку.
Что проверяет это условие?
Deleted Account
хитротааа
Декодер (лысый)
Спасибо большое
Декодер (лысый)
Я в личку скину позже, не против?
Anton
Ребят, вопрос такой возинк.
Как обычно поступают компиляторы в ситуации, когда конструкторы копирования попадают в подмножество конструкторов-шаблонов?
Пример:
template<typename T>
class A {
public:
template<template U>
A(const A<U> &a);
template<template U>
A(A<U> &&a);
}
Anatoly
Anatoly
в твоем случае, компилятор сгенерирует конструктор копирования самостоятельно, как если бы ты объявил
A(const A& ) = default;
Anton
Berkus
Mikhail
а ссылку можно?
Mikhail
И по поводу этого вкраце может ктонибудь объяснить его принцип работы https://github.com/cameron314/concurrentqueue/blob/master/concurrentqueue.h
Mikhail
Artem
Artem
ты читал?
RattenKong 🦧🐀🦍️
Artem
и наверное это должен был быть первый вопрос - ты понимаешь, что такое compare-and-swap (cmpxchg) и вот это все?
RattenKong 🦧🐀🦍️
Artem
Artem
50 пишущих это повод разбить запись на несколько буферов
RattenKong 🦧🐀🦍️
Наверн в худшем случае от количества пишущих зависит
Artem
с меньшим количеством конкурирующих за запись и конкуренцией буферов за флаш в очередь
Artem
от всего зависит, в том числе от удачи-неудачи. тут нет детерминизма
RattenKong 🦧🐀🦍️
неудача это когда первым должен писать, а в итоге последним это делаешь :[
Artem
неудача это когда система строится на предположении о том, что кто-то первым должен писать
Mikhail
Artem
да