Генерация Base64 в многопоточной среде - PullRequest
0 голосов
/ 03 апреля 2020

Я хочу очень быстро генерировать данные 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

Что может быть здесь? Как потоки могут влиять на выполнение блокированного мьютекса?

...