Здравствуйте, я пишу некоторые структуры данных на C, и я понял, что их связанные функции не являются потокобезопасными. Я пишу код использует только стандарт C, и я хочу добиться какой-то «синхронизации».
Я думал сделать что-то вроде этого:
enum sync_e { TRUE, FALSE };
typedef enum sync_e sync;
struct list_s {
//Other stuff
struct list_node_s *head;
struct list_node_s *tail;
enum sync_e locked;
};
typedef struct list_s list;
, чтобы включить в структуру списка «логическое» поле, которое указывает состояние структур: заблокировано, разблокировано.
Например, функция вставки будет переписана следующим образом:
int list_insert_next(list* l, list_node *e, int x){
while(l->locked == TRUE){
/* Wait */
}
l->locked = TRUE;
/* Insert element */
/* -------------- */
l->locked = FALSE;
return (0);
}
При работе со списком в поле «заблокировано» будет установлено значение ИСТИНА, не допускающее никаких других изменений. После завершения операции «заблокированное» поле снова будет установлено на «ИСТИНА».
Этот подход хорош? Знаете ли вы другие подходы (используя только стандарт C).