asvp
> Events.
> Всё остальное (мютексы и т.п. тормозить систему будут).
Ты о каких Events? Если ты про CreateEvent, то оно будет более тормозное, чем мьютекс
StiX
> Если ты про CreateEvent, то оно будет более тормозное, чем мьютекс
O_o. Где об этом написано?
Разница тока в этом:
Объект-мьютекс отличается от остальных объектов ядра тем, что занявшему его потоку передаются права на владение им. Прочие объекты могут быть либо свободны, либо заняты — вот, собственно, и все. А объекты-мьютексы способны еще и запоминать, какому потоку они принадлежат.
Но перед тем как юзать Events, нужно синхронизацию делать через Interlocked, чтобы меньше было переключений в режим ядра.
Kartonagnick
> http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess.html
вот уж из-за какой-то ерунды буст тянут - это 100% оверкилл на ровном месте.
0iStalker
> А если через #pragma data_seg ?
к shared memory необходимо будет пришлёпывать дополнительную синхронизацию. поэтому проще всего, вероятно, вместо этого будет сделать либо пайп, либо сокет.
Suslik
Я за сокеты. Это тебе еще добавит возможность запускать приложения на разных машинах.
Suslik
> к shared memory необходимо будет пришлёпывать дополнительную синхронизацию.
Стандартного мютекса вполне хватит.
> вот уж из-за какой-то ерунды буст тянут - это 100% оверкилл на ровном месте.
> вместо этого будет сделать либо пайп, либо сокет.
А пускать такую ерунду в пайп или сокет- ИМХО тоже оверкилл.
Да и писанины с сокет больше.
Suslik
Рихтера почитай "Совместный доступ процессов к данным через механизм проецирования"
В Windows всегда было много механизмов, позволяющих приложениям легко и быстро разделять какие-либо данные. К этим механизмам относятся RPC, COM, OLE, DDE, оконные сообщения (особенно WM_COPYDATA), буфер обмена, почтовые ящики, сокеты и т.д. Самый низкоуровневый механизм совместного использования данных на одной машине — проецирование файла в память. На нем так или иначе базируются все перечисленные мной механизмы разделения данных. Поэтому, если Вас интересует максимальное быстродействие с минимумом издержек, лучше всего применять именно проецирование.
Suslik
> Поэтому вопрос: какую технологию выбрать для передачи данных под виндой, чтобы
> она была наименее экзотичной?
Я использую shared memory. Ничего экзотичного, всё примитивно и просто, вот код:
// процесс номер 1 // HANDLE hGuiFile = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, FILE_SIZE_IN_BYTES, "MySharedMemory"); char* sharedMem = ( char*)MapViewOfFile( hGuiFile, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0); // процесс номер 2 // HANDLE hSharedMessages = OpenFileMappingA( FILE_MAP_WRITE | FILE_MAP_READ, false, "MySharedMemory"); char* messages = ( char*)MapViewOfFile( hSharedMessages, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0);
FROL
действительно, всё просто, но дополнительно нужно делать синхронизацию чем-то другим, причём межпроцессным. собственно, поэтому и склоняюсь к пайпу или сокетам, потому что они потоковые и синхронизовать там ничего не надо.
Suslik
+1, за сокеты, есть еще такие вещи как ZeroMQ и аналоги, но для IPC это наверное overkill
Я бы тоже сокеты посоветовал, тем более, что в SFML уже есть готовый фрейминг для TCP (если он в данном случае нужен, конечно).
ZeroMQ/nanomsg будет более гибко (куча разных транспортов и возможных топологий), если не пугает дополнительная зависимость.
Suslik
> действительно, всё просто, но дополнительно нужно делать синхронизацию чем-то другим, причём межпроцессным.
Стандартный мютекс же.
// процесс номер 1
//
HANDLE hLockShared = CreateMutex(nullptr, false, "MySharedMemoryLock");
// процесс номер 2
//
HANDLE hLockShared = OpenMutex(MUTEX_ALL_ACCESS, false, "MySharedMemoryLock"));
Кода на 3 строчки.
Если этим будут пользоваться и поддерживать другие (непонятно кто), используй сокеты - с ними многие знакомы.
Если делать эффективно - используй мапинг.
Если делать быстро - пайпы.
А вообще, главное делать рабочий вариани, потомки-джуны все равно зафукают ;)
Была как-то подобная дилемма. Выбрали в итоге сокеты, самый удобный вариант оказался. В нагрузку нахаляву идут, потенциально, кроссплатформа и разнос по разным машинам по необходимости. Но это если нормальная либа есть для работы с сетью, а то с голыми сокетами возиться как-то не очень удобно.
Suslik
> вот уж из-за какой-то ерунды буст тянут - это 100% оверкилл на ровном месте.
Это - кросс-платформа с вменяемым дизайном использования.
Тема в архиве.