Линкование либы в несколько потоков одного процесса.
От: squid_etc  
Дата: 06.12.13 18:18
Оценка:
Добрый день!

Есть библиотека: LibTomCrypt у нее есть удобные методы шифрования.

Для ускорения процесса шифрования была предложена идея распараллелить шифрование на все ядра системы. Для этого был использован пул потоков http://ashishchoure.blogspot.com/2010/05/simplest-threadpool-example-using-c.html в модернизированном варианте.
поток == thread

Проблема в том, что когда в пуле 2 и больше потоков и потоки пытаются вызвать метод шифрования — то один из потоков замерзает — мы не возвращаемся из метода по шифрованию — либа лочит наш поток.

либа собрана статически и статически линкуется к нашему приложению. Ставить лок на использование либы в конкретном месте — не вариант, т.к. шифрование будет ограничиваться линейным шифрованием в либе — которое так и будет проходить в один поток.

мне же нужно в каждом потоке создать экземпляр либы и отдавать каждому экземпляру работу из своего потока.

предложите идеи по реализации? примеры кода?

Спасибо!

07.12.13 20:48: Перенесено модератором из 'C/C++' — Кодт
Re: Линкование либы в несколько потоков одного процесса.
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.12.13 19:25
Оценка:
делите исходные данные на порции, чтоб каждому потоку отдавалась приблизительно равная порция — и не будет заморозок.
но тут важно, чтоб либа не имела общие изменяемые данные.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: Линкование либы в несколько потоков одного процесса.
От: Сергей Мухин Россия  
Дата: 06.12.13 20:44
Оценка: +1
Здравствуйте, squid_etc, Вы писали:

_>мне же нужно в каждом потоке создать экземпляр либы и отдавать каждому экземпляру работу из своего потока.


_>Спасибо!


либа (как Вы это называете) лежит в памяти и принадлежит процессу, а не потоку. Поэтому, если нигде в ее описании не объявлено, что она thread-safe, то использовать ее в разных thread нельзя.

Запускайте процессы, там в каждом будет свой экземпляр либы.
---
С уважением,
Сергей Мухин
Re[2]: Линкование либы в несколько потоков одного процесса.
От: squid_etc  
Дата: 06.12.13 21:07
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>либа (как Вы это называете) лежит в памяти и принадлежит процессу, а не потоку. Поэтому, если нигде в ее описании не объявлено, что она thread-safe, то использовать ее в разных thread нельзя.


СМ>Запускайте процессы, там в каждом будет свой экземпляр либы.


Спасибо за конструктив.
я порылся немного в логировании пула потоков — и уже начал грешить на него. по 1000-5000 запросов проходит нормально. а застопоряется сам поток — толи ему нормально не отдаётся команда на работу, толи еще что.

перепишу пул по-человечески(сам) и дам знать что вышло.
Re[3]: Линкование либы в несколько потоков одного процесса.
От: Сергей Мухин Россия  
Дата: 06.12.13 21:57
Оценка: :)
Здравствуйте, squid_etc, Вы писали:

_>перепишу пул по-человечески(сам) и дам знать что вышло.


не надо!!!
---
С уважением,
Сергей Мухин
Re[2]: Линкование либы в несколько потоков одного процесса.
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.12.13 22:09
Оценка: -1
Здравствуйте, Сергей Мухин, Вы писали:

глупости же пишете.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: Линкование либы в несколько потоков одного процесса.
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.12.13 22:10
Оценка:
Здравствуйте, squid_etc, Вы писали:

_>перепишу пул по-человечески(сам) и дам знать что вышло.

не нужно ничего переписывать. просто прочтите то, что я написал выше.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: Линкование либы в несколько потоков одного процесса.
От: Кодт Россия  
Дата: 07.12.13 16:47
Оценка: +1
Здравствуйте, Сергей Мухин, Вы писали:

СМ>либа (как Вы это называете) лежит в памяти и принадлежит процессу, а не потоку. Поэтому, если нигде в ее описании не объявлено, что она thread-safe, то использовать ее в разных thread нельзя.


На первый взгляд, единственное место, где библиотека не thread-safe — это в hashes/chc/chc.c, там есть две статические переменные.
И то, эти переменные устанавливаются при инициализации модуля.
Хотя, возможно, я плохо смотрел.

Так что я не стал бы априори грешить на небезопасность. Возможно, что баг на клиентской стороне.
Тем более, замораживание. Странно это всё. Может, программа собрана с однопоточным рантаймом? (Безумное предположение, и его стоит исключить с самого начала).
Перекуём баги на фичи!
Re: Линкование либы в несколько потоков одного процесса.
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.12.13 16:54
Оценка:
Здравствуйте, squid_etc, Вы писали:

_>предложите идеи по реализации? примеры кода?


Я очень подозреваю, что бага не в либе, а у вас. LibTomCrypt — это набор криптопримитивов, т.е., вычислительных функций. Я вообще не понимаю, зачем ей внутри себя что-либо лочить.

Если есть уверенность, что программа помирает именно внутри LibTomCrypt'а, попробуйте OpenSSL. За ним вроде не замечены никакие придури, связанные с многопоточностью.

OpenSSL состоит из двух частей — библиотеки криптопримитивов и библиотеки, реализующей сетевой протокол SSL/TLS. Первая от второй не зависит, и, я уверен, содержит все, что вам надо.
Re: Линкование либы в несколько потоков одного процесса.
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.12.13 16:56
Оценка:
Здравствуйте, squid_etc, Вы писали:

_>предложите идеи по реализации? примеры кода?


И еще. Я бы подумал о том, чтобы поназапускать потоков руками, по числу доступный ядер, и привязать каждый к своему ядру — чтобы они не прыгали между ядрами, с потерей содержимогп кэша при каждом прыжке.
Re[2]: Линкование либы в несколько потоков одного процесса.
От: dr. Acula Украина  
Дата: 07.12.13 17:12
Оценка: +1
СМ>либа (как Вы это называете) лежит в памяти и принадлежит процессу, а не потоку. Поэтому, если нигде в ее описании не объявлено, что она thread-safe, то использовать ее в разных thread нельзя.

C таким же успехом thread-safe может означать глобальный мютекс. И тогда все манипуляции с либой будут безопасными в многопоточном окружении, но идти строго последовательно.
Re[3]: Линкование либы в несколько потоков одного процесса.
От: Сергей Мухин Россия  
Дата: 07.12.13 17:36
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Тем более, замораживание. Странно это всё.


да
---
С уважением,
Сергей Мухин
Re: Линкование либы в несколько потоков одного процесса.
От: Ops Россия  
Дата: 07.12.13 18:12
Оценка:
Здравствуйте, squid_etc, Вы писали:

Ну как минимум в документации есть замечания по потоко-безопасности.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: Линкование либы в несколько потоков одного процесса.
От: squid_etc  
Дата: 07.12.13 21:15
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Если есть уверенность, что программа помирает именно внутри LibTomCrypt'а, попробуйте OpenSSL. За ним вроде не замечены никакие придури, связанные с многопоточностью.


Спасибо за глубокое понимание проблемы. с OpenSSL уже работал, но в нем нет поддержки ЕСС шифрования(именно его я использую в томкрипте)
Re[3]: Линкование либы в несколько потоков одного процесса.
От: wander  
Дата: 07.12.13 21:19
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Сергей Мухин, Вы писали:


X>глупости же пишете.


А что конкретно глупого? Ну может быть он не понял вопрос, это я могу допустить. Но чтоб прям глупости... или я тоже чего-то не понял?
Re[2]: Линкование либы в несколько потоков одного процесса.
От: squid_etc  
Дата: 07.12.13 21:19
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>И еще. Я бы подумал о том, чтобы поназапускать потоков руками, по числу доступный ядер, и привязать каждый к своему ядру — чтобы они не прыгали между ядрами, с потерей содержимогп кэша при каждом прыжке.


и еще раз спасибо за участие.
я запускаю как раз то количество потоков, для шифрования, сколько и коров на машине.
и я экспериментировал с привязкой потока к конкретному кору: при этом(при жёсткой привязке потока к кору) увеличивается загрузка проца. если потоки будут настроены по умолчанию(могут выполнятся на всех корах — реально работу делает тот кор, который свободен) — то загрузка проца меньше в разы, а скорость шифрации таже. так что лучше не привязываться — как и говорится во всех мануалах по привязке потоков к корам.

спс
Re[3]: Линкование либы в несколько потоков одного процесса.
От: switch0do Антарктида  
Дата: 07.12.13 22:01
Оценка:
_>Спасибо за глубокое понимание проблемы. с OpenSSL уже работал, но в нем нет поддержки ЕСС шифрования(именно его я использую в томкрипте)

Правда?
http://stackoverflow.com/questions/1152555/encrypting-decrypting-text-strings-using-openssl-ecc
Re[4]: Линкование либы в несколько потоков одного процесса.
От: niXman Ниоткуда https://github.com/niXman
Дата: 07.12.13 22:23
Оценка:
Здравствуйте, wander, Вы писали:

W>А что конкретно глупого?

зачем рекомендовать создавать процессы?

а вообще, сдается мне, ТС совершенно не понимает сабжа...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: Линкование либы в несколько потоков одного процесса.
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.12.13 22:36
Оценка:
Здравствуйте, squid_etc, Вы писали:

Pzz>>Если есть уверенность, что программа помирает именно внутри LibTomCrypt'а, попробуйте OpenSSL. За ним вроде не замечены никакие придури, связанные с многопоточностью.


_>Спасибо за глубокое понимание проблемы. с OpenSSL уже работал, но в нем нет поддержки ЕСС шифрования(именно его я использую в томкрипте)


Вроде уже есть.
Re[3]: Линкование либы в несколько потоков одного процесса.
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.12.13 22:51
Оценка:
Здравствуйте, squid_etc, Вы писали:

_>и я экспериментировал с привязкой потока к конкретному кору: при этом(при жёсткой привязке потока к кору) увеличивается загрузка проца. если потоки будут настроены по умолчанию(могут выполнятся на всех корах — реально работу делает тот кор, который свободен) — то загрузка проца меньше в разы, а скорость шифрации таже. так что лучше не привязываться — как и говорится во всех мануалах по привязке потоков к корам.


Непонятно, с чего бы. Казалось бы, если процессор загружен, то он что-то делает, и результаты этой деятельности должны быть как-то видны.

Может, если потоки не привязаны к ядру, то измерялка загрузки глючит?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.