Удаление 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. Я понимаю что это может, и скорее всего вызовет проблемы, но не знаю как разрешить ситуацию.


Ответы (0 шт):