Проблема в том, что когда в пуле 2 и больше потоков и потоки пытаются вызвать метод шифрования — то один из потоков замерзает — мы не возвращаемся из метода по шифрованию — либа лочит наш поток.
либа собрана статически и статически линкуется к нашему приложению. Ставить лок на использование либы в конкретном месте — не вариант, т.к. шифрование будет ограничиваться линейным шифрованием в либе — которое так и будет проходить в один поток.
мне же нужно в каждом потоке создать экземпляр либы и отдавать каждому экземпляру работу из своего потока.
предложите идеи по реализации? примеры кода?
Спасибо!
07.12.13 20:48: Перенесено модератором из 'C/C++' — Кодт
Re: Линкование либы в несколько потоков одного процесса.
делите исходные данные на порции, чтоб каждому потоку отдавалась приблизительно равная порция — и не будет заморозок.
но тут важно, чтоб либа не имела общие изменяемые данные.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: Линкование либы в несколько потоков одного процесса.
Здравствуйте, squid_etc, Вы писали:
_>мне же нужно в каждом потоке создать экземпляр либы и отдавать каждому экземпляру работу из своего потока.
_>Спасибо!
либа (как Вы это называете) лежит в памяти и принадлежит процессу, а не потоку. Поэтому, если нигде в ее описании не объявлено, что она thread-safe, то использовать ее в разных thread нельзя.
Запускайте процессы, там в каждом будет свой экземпляр либы.
---
С уважением,
Сергей Мухин
Re[2]: Линкование либы в несколько потоков одного процесса.
Здравствуйте, Сергей Мухин, Вы писали:
СМ>либа (как Вы это называете) лежит в памяти и принадлежит процессу, а не потоку. Поэтому, если нигде в ее описании не объявлено, что она thread-safe, то использовать ее в разных thread нельзя.
СМ>Запускайте процессы, там в каждом будет свой экземпляр либы.
Спасибо за конструктив.
я порылся немного в логировании пула потоков — и уже начал грешить на него. по 1000-5000 запросов проходит нормально. а застопоряется сам поток — толи ему нормально не отдаётся команда на работу, толи еще что.
перепишу пул по-человечески(сам) и дам знать что вышло.
Re[3]: Линкование либы в несколько потоков одного процесса.
Здравствуйте, squid_etc, Вы писали:
_>перепишу пул по-человечески(сам) и дам знать что вышло.
не нужно ничего переписывать. просто прочтите то, что я написал выше.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: Линкование либы в несколько потоков одного процесса.
Здравствуйте, Сергей Мухин, Вы писали:
СМ>либа (как Вы это называете) лежит в памяти и принадлежит процессу, а не потоку. Поэтому, если нигде в ее описании не объявлено, что она thread-safe, то использовать ее в разных thread нельзя.
На первый взгляд, единственное место, где библиотека не thread-safe — это в hashes/chc/chc.c, там есть две статические переменные.
И то, эти переменные устанавливаются при инициализации модуля.
Хотя, возможно, я плохо смотрел.
Так что я не стал бы априори грешить на небезопасность. Возможно, что баг на клиентской стороне.
Тем более, замораживание. Странно это всё. Может, программа собрана с однопоточным рантаймом? (Безумное предположение, и его стоит исключить с самого начала).
Перекуём баги на фичи!
Re: Линкование либы в несколько потоков одного процесса.
Здравствуйте, squid_etc, Вы писали:
_>предложите идеи по реализации? примеры кода?
Я очень подозреваю, что бага не в либе, а у вас. LibTomCrypt — это набор криптопримитивов, т.е., вычислительных функций. Я вообще не понимаю, зачем ей внутри себя что-либо лочить.
Если есть уверенность, что программа помирает именно внутри LibTomCrypt'а, попробуйте OpenSSL. За ним вроде не замечены никакие придури, связанные с многопоточностью.
OpenSSL состоит из двух частей — библиотеки криптопримитивов и библиотеки, реализующей сетевой протокол SSL/TLS. Первая от второй не зависит, и, я уверен, содержит все, что вам надо.
Re: Линкование либы в несколько потоков одного процесса.
Здравствуйте, squid_etc, Вы писали:
_>предложите идеи по реализации? примеры кода?
И еще. Я бы подумал о том, чтобы поназапускать потоков руками, по числу доступный ядер, и привязать каждый к своему ядру — чтобы они не прыгали между ядрами, с потерей содержимогп кэша при каждом прыжке.
Re[2]: Линкование либы в несколько потоков одного процесса.
СМ>либа (как Вы это называете) лежит в памяти и принадлежит процессу, а не потоку. Поэтому, если нигде в ее описании не объявлено, что она thread-safe, то использовать ее в разных thread нельзя.
C таким же успехом thread-safe может означать глобальный мютекс. И тогда все манипуляции с либой будут безопасными в многопоточном окружении, но идти строго последовательно.
Re[3]: Линкование либы в несколько потоков одного процесса.
Здравствуйте, Pzz, Вы писали:
Pzz>Если есть уверенность, что программа помирает именно внутри LibTomCrypt'а, попробуйте OpenSSL. За ним вроде не замечены никакие придури, связанные с многопоточностью.
Спасибо за глубокое понимание проблемы. с OpenSSL уже работал, но в нем нет поддержки ЕСС шифрования(именно его я использую в томкрипте)
Re[3]: Линкование либы в несколько потоков одного процесса.
Здравствуйте, Pzz, Вы писали:
Pzz>И еще. Я бы подумал о том, чтобы поназапускать потоков руками, по числу доступный ядер, и привязать каждый к своему ядру — чтобы они не прыгали между ядрами, с потерей содержимогп кэша при каждом прыжке.
и еще раз спасибо за участие.
я запускаю как раз то количество потоков, для шифрования, сколько и коров на машине.
и я экспериментировал с привязкой потока к конкретному кору: при этом(при жёсткой привязке потока к кору) увеличивается загрузка проца. если потоки будут настроены по умолчанию(могут выполнятся на всех корах — реально работу делает тот кор, который свободен) — то загрузка проца меньше в разы, а скорость шифрации таже. так что лучше не привязываться — как и говорится во всех мануалах по привязке потоков к корам.
спс
Re[3]: Линкование либы в несколько потоков одного процесса.
Здравствуйте, squid_etc, Вы писали:
Pzz>>Если есть уверенность, что программа помирает именно внутри LibTomCrypt'а, попробуйте OpenSSL. За ним вроде не замечены никакие придури, связанные с многопоточностью.
_>Спасибо за глубокое понимание проблемы. с OpenSSL уже работал, но в нем нет поддержки ЕСС шифрования(именно его я использую в томкрипте)
Здравствуйте, squid_etc, Вы писали:
_>и я экспериментировал с привязкой потока к конкретному кору: при этом(при жёсткой привязке потока к кору) увеличивается загрузка проца. если потоки будут настроены по умолчанию(могут выполнятся на всех корах — реально работу делает тот кор, который свободен) — то загрузка проца меньше в разы, а скорость шифрации таже. так что лучше не привязываться — как и говорится во всех мануалах по привязке потоков к корам.
Непонятно, с чего бы. Казалось бы, если процессор загружен, то он что-то делает, и результаты этой деятельности должны быть как-то видны.
Может, если потоки не привязаны к ядру, то измерялка загрузки глючит?