Сообщение Вопрос по boost lockfree queue от 26.04.2015 11:27
Изменено 26.04.2015 11:29 Engler
Коллеги,
Есть есть boost lock free очередь. 2 producer и 1 consumer.
(Код основан на примере из буста. Только тип сообщения из очереди не int , а мой кастомный ). Пытаюсь замерить среднее время сообщения в очереди.
Соответсвено перед тем как послать сообщение, получаем текущее время.
Записываем в сообщение. На принимающей стороне вычитываем сообщение.
Получаем текущее время. Переводим в наносекунды. Суммируем.
В конце делим получившееся время на кол-во сообщений.
Но у меня получаются старнные результаты.
Если ставить lock все работает как и ожидалось, нормально. Результат будет дальше.
Если лок снять, то происходят странности.
Total time = это сколько суммарно мы насчитали нано секунд
(1с = 1,000,000,000 нано секунд ).
Программку запускал под утилитой time, что бы проверить результаты.
Вариант, с Lock работате "как надо", т.е суммарно Total time ~= user time (из утилиты time)
Без Lock результаты не совпадают. Причем очень сильно.
Очень внимательно изучил документацию. Не один раз.
Ограничения на тип выполнены:
Вот метод push
Говорят thread-safe.
Что пробовал:
Заменял DataType на DataType* ( т.е передовать не сообщение а указатель )
Линковать 32 и 64 битные релизные версии библиотеки.
(В случае с 32 бибтной версией, естесвенно компилировалал с ключом -m32 )
Различные версии gcc ( 4.8.2 / 4.8.3 / 4.9.1 / еще что то там ).
Различные версии linux: Alt / Ubuntu 14.04 LTS / Centos 7
Игрался с выравниванием струткруты.
Ииспользовал метод push_bounded
Использовал очередь с динамическим выделением объектов
Пробовал создавать соощение в динамической памяти, а не на стеке.
Пробовал создавать каждый раз новое сообщение, и слать его.
....
Пока ничего не помогло...
Есть у кого какие-нибудь идеи?
Есть есть boost lock free очередь. 2 producer и 1 consumer.
(Код основан на примере из буста. Только тип сообщения из очереди не int , а мой кастомный ). Пытаюсь замерить среднее время сообщения в очереди.
Соответсвено перед тем как послать сообщение, получаем текущее время.
Записываем в сообщение. На принимающей стороне вычитываем сообщение.
Получаем текущее время. Переводим в наносекунды. Суммируем.
В конце делим получившееся время на кол-во сообщений.
Но у меня получаются старнные результаты.
Если ставить lock все работает как и ожидалось, нормально. Результат будет дальше.
Если лок снять, то происходят странности.
Исходный код | |
| |
Total time = это сколько суммарно мы насчитали нано секунд
(1с = 1,000,000,000 нано секунд ).
Программку запускал под утилитой time, что бы проверить результаты.
Вариант, с Lock работате "как надо", т.е суммарно Total time ~= user time (из утилиты time)
Результат с раскомментированным Lock | |
| |
Без Lock результаты не совпадают. Причем очень сильно.
Результат с закомментированным Lock | |
| |
Подробнее о системе | |
Centos 7: 3.10.0-123.el7.x86_64 g++ (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9) boost 1.58_0: system and thread Буст собирал сам с этим же компилятором. | |
Очень внимательно изучил документацию. Не один раз.
Ограничения на тип выполнены:
Requirements:
•T must have a copy constructor
•T must have a trivial assignment operator
•T must have a trivial destructor
Вот метод push
Говорят thread-safe.
Что пробовал:
Заменял DataType на DataType* ( т.е передовать не сообщение а указатель )
Линковать 32 и 64 битные релизные версии библиотеки.
(В случае с 32 бибтной версией, естесвенно компилировалал с ключом -m32 )
Различные версии gcc ( 4.8.2 / 4.8.3 / 4.9.1 / еще что то там ).
Различные версии linux: Alt / Ubuntu 14.04 LTS / Centos 7
Игрался с выравниванием струткруты.
Ииспользовал метод push_bounded
Использовал очередь с динамическим выделением объектов
Пробовал создавать соощение в динамической памяти, а не на стеке.
Пробовал создавать каждый раз новое сообщение, и слать его.
....
Пока ничего не помогло...
Есть у кого какие-нибудь идеи?
Вопрос по boost lockfree queue
Коллеги,
Есть есть boost lock free очередь. 2 producer и 1 consumer.
(Код основан на примере из буста. Только тип сообщения из очереди не int , а мой кастомный ). Пытаюсь замерить среднее время сообщения в очереди.
Соответсвено перед тем как послать сообщение, получаем текущее время.
Записываем в сообщение. На принимающей стороне вычитываем сообщение.
Получаем текущее время. Переводим в наносекунды. Суммируем.
В конце делим получившееся время на кол-во сообщений.
Но у меня получаются старнные результаты.
Если ставить lock все работает как и ожидалось, нормально (имеется ввиду producerLock в методe produce). Результат будет дальше.
Если лок снять, то происходят странности.
Total time = это сколько суммарно мы насчитали нано секунд
(1с = 1,000,000,000 нано секунд ).
Программку запускал под утилитой time, что бы проверить результаты.
Вариант, с Lock работате "как надо", т.е суммарно Total time ~= user time (из утилиты time)
Без Lock результаты не совпадают. Причем очень сильно.
Очень внимательно изучил документацию. Не один раз.
Ограничения на тип выполнены:
Вот метод push
Говорят thread-safe.
Что пробовал:
Заменял DataType на DataType* ( т.е передовать не сообщение а указатель )
Линковать 32 и 64 битные релизные версии библиотеки.
(В случае с 32 бибтной версией, естесвенно компилировалал с ключом -m32 )
Различные версии gcc ( 4.8.2 / 4.8.3 / 4.9.1 / еще что то там ).
Различные версии linux: Alt / Ubuntu 14.04 LTS / Centos 7
Игрался с выравниванием струткруты.
Ииспользовал метод push_bounded
Использовал очередь с динамическим выделением объектов
Пробовал создавать соощение в динамической памяти, а не на стеке.
Пробовал создавать каждый раз новое сообщение, и слать его.
....
Пока ничего не помогло...
Есть у кого какие-нибудь идеи?
Есть есть boost lock free очередь. 2 producer и 1 consumer.
(Код основан на примере из буста. Только тип сообщения из очереди не int , а мой кастомный ). Пытаюсь замерить среднее время сообщения в очереди.
Соответсвено перед тем как послать сообщение, получаем текущее время.
Записываем в сообщение. На принимающей стороне вычитываем сообщение.
Получаем текущее время. Переводим в наносекунды. Суммируем.
В конце делим получившееся время на кол-во сообщений.
Но у меня получаются старнные результаты.
Если ставить lock все работает как и ожидалось, нормально (имеется ввиду producerLock в методe produce). Результат будет дальше.
Если лок снять, то происходят странности.
Исходный код | |
| |
Total time = это сколько суммарно мы насчитали нано секунд
(1с = 1,000,000,000 нано секунд ).
Программку запускал под утилитой time, что бы проверить результаты.
Вариант, с Lock работате "как надо", т.е суммарно Total time ~= user time (из утилиты time)
Результат с раскомментированным Lock | |
| |
Без Lock результаты не совпадают. Причем очень сильно.
Результат с закомментированным Lock | |
| |
Подробнее о системе | |
Centos 7: 3.10.0-123.el7.x86_64 g++ (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9) boost 1.58_0: system and thread Буст собирал сам с этим же компилятором. | |
Очень внимательно изучил документацию. Не один раз.
Ограничения на тип выполнены:
Requirements:
•T must have a copy constructor
•T must have a trivial assignment operator
•T must have a trivial destructor
Вот метод push
Говорят thread-safe.
Что пробовал:
Заменял DataType на DataType* ( т.е передовать не сообщение а указатель )
Линковать 32 и 64 битные релизные версии библиотеки.
(В случае с 32 бибтной версией, естесвенно компилировалал с ключом -m32 )
Различные версии gcc ( 4.8.2 / 4.8.3 / 4.9.1 / еще что то там ).
Различные версии linux: Alt / Ubuntu 14.04 LTS / Centos 7
Игрался с выравниванием струткруты.
Ииспользовал метод push_bounded
Использовал очередь с динамическим выделением объектов
Пробовал создавать соощение в динамической памяти, а не на стеке.
Пробовал создавать каждый раз новое сообщение, и слать его.
....
Пока ничего не помогло...
Есть у кого какие-нибудь идеи?