Допустим, я создаю библиотеку для запуска quux на C.
Для успешного запуска Quux нужны две переменные состояния:
static int quux_state;
static char* quux_address;
/* function to spork quuxes found in a file,
reads a line from the file each time it's called. */
void spork_quux(FILE*);
Если я сохраню эти данные как глобальные переменные, только один клиент сможет запускать quux за один раз, иначе переменные состояния будут искажены вторым вызывающим абонентом, и может произойти катастрофа.
Вопрос в том, как лучше всего разработать реентерабельную библиотеку на C?
Я рассмотрел следующие случаи, но не пришел к удовлетворительному выводу.
В следующем случае возникает вопрос, как связать клиента с каждым состоянием?
/* library handles all state data allocation */
static int* quux_state;
static char** quux_address;
В следующем случае клиент может возиться с состоянием, что очень нежелательно.
/* let each client store state */
typedef struct { int state; char* address; } QuuxState;
QuuxState spork_quux(FILE*);
Итак, как это сделать правильно?