Управление памятью объекта используемого в 2х потоках
От: Alexandrovich Россия  
Дата: 18.11.09 16:50
Оценка:
Допустим, функция основного потока создает объект.
Созданый объект вызывает определенную функцию которая выполняется в другом потоке, в который в свою очередь передается указатель на данный объект.

Илюстрация описанного в коде:

void SomeRequest()
{
  CRequest* req = new CRequest;
  req->DoRequest();

  // Может быть еще вызов DoRequest()
  // req->DoRequest();
  // А может нужно удалить объект? Не получится, т.к. используется в другом потоке
  // delete req; req = NULL;
}

void CRequest::DoRequest()
{
  DWORD dwThreadID;
  HANDLE hThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DoRequestTread, (LPVOID)this, 0, &dwThreadID);
  if(hThread)
  {
    CloseHandle(hThread);
  }
}

// Функция выполняющая запрос в отдельном потоке
UINT CRequest::DoRequestTread(LPVOID p)
{
  CRequest* r=(CRequest*)p;
  if(r)
  {
    r->DoRequestWininet();
  }
  ExitThread(0);
  return 0;
}


Как очистить память под объект CRequest, если в функции параллельного потока это делать не допустимо, поскольку объект может еще использоваться
Re: Управление памятью объекта используемого в 2х потоках
От: SergH Россия  
Дата: 18.11.09 17:58
Оценка:
Здравствуйте, Alexandrovich, Вы писали:

A>Как очистить память под объект CRequest, если в функции параллельного потока это делать не допустимо, поскольку объект может еще использоваться


Счётчик ссылок прикрутить.
Делай что должно, и будь что будет
Re: Управление памятью объекта используемого в 2х потоках
От: Аноним  
Дата: 18.11.09 20:22
Оценка:
Здравствуйте, Alexandrovich, Вы писали:

A>Как очистить память под объект CRequest, если в функции параллельного потока это делать не допустимо, поскольку объект может еще использоваться


Можно положиться на boost::shared_ptr
Re[2]: Управление памятью объекта используемого в 2х потоках
От: Alexandrovich Россия  
Дата: 19.11.09 12:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Alexandrovich, Вы писали:


A>>Как очистить память под объект CRequest, если в функции параллельного потока это делать не допустимо, поскольку объект может еще использоваться


А>Можно положиться на boost::shared_ptr


А std::auto_ptr спасет? boost прикручивать нет возможности
Re[3]: Управление памятью объекта используемого в 2х потоках
От: SergH Россия  
Дата: 19.11.09 12:50
Оценка:
Здравствуйте, Alexandrovich, Вы писали:

A>А std::auto_ptr спасет? boost прикручивать нет возможности


auto_ptr не умеет считать ссылки.
Делай что должно, и будь что будет
Re[3]: Управление памятью объекта используемого в 2х потоках
От: Аноним  
Дата: 19.11.09 15:59
Оценка:
Здравствуйте, Alexandrovich, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Alexandrovich, Вы писали:


A>>>Как очистить память под объект CRequest, если в функции параллельного потока это делать не допустимо, поскольку объект может еще использоваться


А>>Можно положиться на boost::shared_ptr


A>А std::auto_ptr спасет? boost прикручивать нет возможности


Нет, не подойдет.
А в чем проблема прикрутить часть буста, который с boost::shared_ptr ?
Там все нормально выдергивается так, что будут нужны только хедеры.
А иначе ты вынужден будешь писать свой велосипед,
на отладку которого ты потратишь на порядок больше времени, чем на буст.
Re[3]: Управление памятью объекта используемого в 2х потоках
От: MT-Wizard Украина  
Дата: 20.11.09 14:48
Оценка:
Здравствуйте, Alexandrovich, Вы писали:
...
A>А std::auto_ptr спасет? boost прикручивать нет возможности

С вызовом ExitThread() даже boost::shared_ptr не спасёт
А ти, москалику, вже приїхав (с)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.