Удаление mutex'а внутри динамического объекта
Пишу что-то вроде многопоточного динамического буфера, со структурой:
typedef struct bs_t { // byte_stream
mtx_t* guard ;
size_t allocated;
size_t size ;
size_t offset ;
} *bs_t;
Конструктор объекта:
bs_t bs_ctor(size_t size) {
...
bs_t stream = (bs_t)malloc(sizeof(struct bst_t) + size);
mtx_init(stream->guard);
...
}
Деструктор объекта:
void bs_dtor(bs_t* stream) {
...
mtx_lock((*stream)->guard);
mtx_t* guard = (*bs)->guard;
free(*stream);
*stream = NULL;
mtx_unlock(guard);
mtx_destroy(guard);
...
}
Сами буферы могу создаваться и удаляться по мере надобности внутри приложения.
Вопрос в том, что когда отрабатывает деструктор - он после удаления самой структуры буфера разблокирует мьютекс, а далее удаляет его. В следствии чего на этом этапе другой поток может успеть его заблокировать и начать писать в структуру, которой уже нет, а mtx_destroy попробует удалить залоченный мьютекс, что как бы UB. Я понимаю что это может, и скорее всего вызовет проблемы, но не знаю как разрешить ситуацию.