одновременный доступ и свободный от кучи объект - PullRequest
1 голос
/ 02 февраля 2012

Этот вопрос является возможной дополнительной проблемой для этого одновременного доступа и без структуры данных

Другой вопрос открыт для проектирования, этот более конкретный.

struct ds
{
   int x,y,z;       
   pthread_mutex_t mutex;
};

Мне нужно детерминированное решение, с помощью которого я могу одновременно получить доступ к 1 объекту типа ds и освободить его.

Ограничения:

  1. Вы можете сделать мьютекс указателем, но не можете извлечь его из объекта.

Реальная проблема:

Освобождение невозможно, удерживая блокировку, потому что память, занятая блокировкой, также теряется.

Я прочитал много статей и статей по подсчету ссылок, но каждый из них держит замок вне ds.Я хочу решение, где я могу сохранить блокировку или ссылку на блокировку внутри DS.

1 Ответ

1 голос
/ 02 февраля 2012

Поскольку вы говорите, что «мьютекс может быть указателем», вы можете сделать что-то вроде этого:

struct ds { pthread_mutex_t * mutex; /* ... */ };

struct ds * create_ds()
{
    struct ds * p = calloc(1, sizeof(struct ds));
    pthread_mutex_t * q = malloc(sizeof(pthread_mutex_t));
    pthread_mutex_init(q, NULL);
    ds->mutex = q;
    return p;
}

void free_ds(struct ds * p)
{
    pthread_mutex_t * q = p->mutex;
    pthread_mutex_lock(q);
    free(p);
    pthread_mutex_unlock(q);
    pthread_mutex_destroy(q);
    free(q);
}

На мой взгляд, уничтожение объекта на самом деле не то, что подходит для одновременного доступаидиома синхронизации.Если вы уничтожаете что-то, его больше нет, поэтому все потоки затронуты этим.Как поток должен знать, указывает ли данный указатель ds на что-то допустимое?

Вместо этого вам, вероятно, нужно иметь где-то коллекцию из ds объектов и вставить /Доступ для удаления этой коллекции должен иметь свой собственный мьютекс всей коллекции.Каждый раз, когда поток хочет получить ссылку на объект в коллекции, он должен делать это под защитой мьютекса, и коллекция должна знать, кто в данный момент содержит ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...