Я хочу очень быстро генерировать данные Base64 в C (или C ++) на устройстве ARM.
Я нашел эту замечательную lib от aklomp .
Он пытается использовать инструкции SIMD для процессора, если он доступен, но у моего процессора его нет.
В любом случае, без него все еще очень быстро, вот мой фрагмент:
char Base64Buffer[5500];
// buffer_size is max 4096
int writeOutput(uint8_t *buffer, int buffer_size) {
mutex.lock();
base64_encode((const char*)buffer, buffer_size, Base64Buffer, &Base64Length, 0);
...
mutex.unlock();
return 0;
}
writeOutput
является функцией stati c и может вызываться из нескольких потоков одновременно. Поэтому я применил мьютекс (от Boost), чтобы избежать одновременных вызовов.
Этот код работает очень хорошо, если его вызывает только один поток.
Однако, когда я увеличиваю количество потоков, в в случае примерно трех одновременно работающих потоков функция base64_encode
иногда создает недопустимый поток base64.
К сожалению, я не знаю, что представляли собой необработанные (некодированные) данные, но у меня есть образец неправильно закодированных данных : https://pastebin.com/ggrcQ1kD
Что может быть здесь? Как потоки могут влиять на выполнение блокированного мьютекса?