WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  проблемы с многопоточностью

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   проблемы с многопоточностью
mazzy опубликован 22-05-2001 16:20 MSK   Click Here to See the Profile for mazzy   Click Here to Email mazzy  
поток запускает ф-ю, которая, в свою очередь запускает несколько потоков с такой-же ф-ей,по идее она передаёт каждому потоку разные параметры , и они должны быть локальными для каждого потока, напрямую передать пар-ы не получилось, а только по ссылке,но родительский поток умирает раньше, чем передаються парам-ы,можно конечно Sleep но оч плохо выходит, мож кто подскажет решение, заранее благодарен!
OlegN опубликован 22-05-2001 16:49 MSK     Click Here to See the Profile for OlegN  Click Here to Email OlegN     
Одно из решений выглядит приблизительно так :
class CMyData
{
CMyData():m_iRef(1) { инициализация контента }
int AddRef() { return ++m_iRef; }
int Release() { if(--m_iRef > 0) return m_iRef;
delete this; return 0; }
protected:
~CMyData();
int m_iRef;
CMyDataContent m_Data; // данные, которые ты передаешь в поток
};
Перед созданием потока увеличь
количество ссылок на CMyData вызывав AddRef
а при завершении потока вызови Release.
Чтобы предотвратить явный вызов деструктора
CMyData сделай его protected или даже private.
Приблизительно это выглядит так :
CMyData* pMyData = new CMyData(....
// инициализация CMyData, m_iRef = 1
pMyData->AddRef();
// m_iRef = 2
_beginthread( MyFunc, 0, pMyData);

// перед выходом из функции
pMyData->Release();
// m_iRef = 1


void MyFunc(void* data)
{
CMyData* pMyData = (CMyData*)data;

.......


pMyData->Release();
// m_iRef = 0, вызов деструктора
}

Rush опубликован 23-05-2001 22:31 MSK     Click Here to See the Profile for Rush  Click Here to Email Rush     
1. Товарисч ОлегН фанат СОМ :)
2. Он абсолютно прав, тока вот
CMyData():m_iRef(1) - тут 1 на 0 заменить надо
3. Можно сделать проще, и копировать данные, затем их уничтожая (уничтожает данные не родитель, а дочерний процесс)
OlegN опубликован 24-05-2001 13:15 MSK     Click Here to See the Profile for OlegN  Click Here to Email OlegN     
2Rush
Я не фанат COM,
только в случае разделения ресурса(объекта, данных) между потоками выгоднее использовать
AddRef и Release, особенно когда точно не известно, кто будет уничтожать ресурс,
основной поток или порожденные потоки.
А в случае
> CMyData():m_iRef(1) тут 1 на 0 заменить надо -
это кому как нравится, если CMyData():m_iRef(0) , то в этом случае после конструктора нужно сразу вызывать AddRef(), а
если CMyData():m_iRef(1) то не нужно.
mazzy опубликован 01-06-2001 14:06 MSK     Click Here to See the Profile for mazzy  Click Here to Email mazzy     
процесс сам себя грохает, в этом и трабл.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.