У меня есть flex-модуль в проекте C ++, который я хочу вызывать из нескольких потоков.
Опции моего .lex файла включают в себя стек и повторный вход.
Предполагая, что можно вызывать yylex на разных объектах сканера из разных потоков одновременно и не иметь одного блока лексической последовательности для другого (что, как я думаю , но я не совсем уверен), как мне это сделать? восстановить вывод для каждого из них? Единственное средство, которое я вижу для этого, это yyset_out (дескриптор FILE *, сканер yyscan_t), но я не хочу использовать файлы, потому что мне нужны только результаты лексинга без необходимости записи в файл.
Я установил вход с помощью:
void scanProcedure(...threadInfo...) {
yyscan_t tscanner;
yylex_init(tscanner);
yy_scan_string(threadInfo->lexMe, tscanner);
yylex(tscanner);
/* how to retrieve results of lexing in a
reentrant manner ( no global state info )
without having to do any file i/o */
/* threadInfo-> ?? */
yylex_destroy(tscanner);
}
...
pthread_create( ... scanProcedure ... threadInfoA ... );
pthread_create( ... scanProcedure ... threadInfoB ... );
pthread_create( ... scanProcedure ... threadInfoC ... );
pthread_join( ... );
Кроме того, я понимаю, что мог бы вызвать yyset_out для временного файла и затем получить доступ к файловому буферу, но мне кажется, что должно быть более красивое (менее хакерское) решение, чем это.