Потоки разделяемой модели с указателями - PullRequest
1 голос
/ 05 марта 2011

У меня есть вектор указателей на объекты, созданные с помощью new .Несколько потоков получают доступ к этому вектору безопасным образом с различными методами получения / установки.Однако поток может удалить один из объектов, и в этом случае указатель другого потока на объект больше не действителен.Как метод может узнать, действителен ли указатель?Варианты 1 и 2 на самом деле, кажется, работают хорошо.Я не знаю, как они будут масштабироваться.Каков наилучший подход?Существует ли портативная версия 3?

Тестирование примеров правильности указателей, которые работают:

1. Используйте целые числа вместо указателей.Хеш (std :: map) проверяет, является ли указатель действительным.Публичные методы выглядят так:

get(size_t iKey)
{
   if((it = mMap.find(iKey)) != mMap.end())
   {
       TMyType * pMyType = it->second;
       // do something with pMyType
   }
}

2. Имеет вектор shared_ptr .Каждый поток пытается вызвать lock () на своем weak_ptr .Если возвращенный shared_ptr равен нулю, мы знаем, что кто-то удалил его, пока мы ждали.Публичные методы выглядят так:

get(boost::weak_ptr<TMyType> pMyType)
{
    boost::shared_ptr<TMyType> pGOOD = pMyType.lock();
    if (pGOOD  != NULL)
    {
         // Do something with pGOOD
    }
} 

3. Проверка на нулевое значение для простых необработанных указателей?Возможно ли это?

get(TMyType * pMyType)
{
    if(pMyType != NULL){ //do something }
}

1 Ответ

2 голосов
/ 05 марта 2011

# 3 не будет работать.Удаление указателя и установка его в NULL не влияет на другие указатели, которые указывают на тот же объект.Вы не можете ничего сделать с необработанными указателями, чтобы определить, удален ли объект.

# 1 - фактически указатель на указатель.Если вы всегда обращаетесь к нему через этот указатель и можете заблокировать его.Если нет, что произойдет, если он будет удален в другом потоке после того, как вы успешно его получите?

# 2 - стандартная реализация такого рода идеи, и шаблон используется во многих библиотеках.Зафиксируйте ручку, получив указатель.Если вы получите это, используйте его.Если нет, то его уже нет.

...