Автор
|
Тема: проблемы с многопоточностью
|
mazzy |
опубликован 22-05-2001 16:20 MSK
поток запускает ф-ю, которая, в свою очередь запускает несколько потоков с такой-же ф-ей,по идее она передаёт каждому потоку разные параметры , и они должны быть локальными для каждого потока, напрямую передать пар-ы не получилось, а только по ссылке,но родительский поток умирает раньше, чем передаються парам-ы,можно конечно Sleep но оч плохо выходит, мож кто подскажет решение, заранее благодарен!
|
OlegN
|
опубликован 22-05-2001 16:49 MSK
Одно из решений выглядит приблизительно так : 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
1. Товарисч ОлегН фанат СОМ :) 2. Он абсолютно прав, тока вот CMyData():m_iRef(1) - тут 1 на 0 заменить надо 3. Можно сделать проще, и копировать данные, затем их уничтожая (уничтожает данные не родитель, а дочерний процесс)
|
OlegN
|
опубликован 24-05-2001 13:15 MSK
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
процесс сам себя грохает, в этом и трабл. |