параллельное с ++ объединение в .net 1.1 - PullRequest
0 голосов
/ 10 июня 2009

Я пытаюсь порождать и затем объединять два потока, используя MS VS 6.0 (2003), MS .NET Framework 1.1.

Следующее решение кажется разумным:

CWinThread* thread1 = AfxBeginThread(worker, &parallel_params);
CWinThread* thread2 = AfxBeginThread(worker, &parallel_params);
WaitForSingleObject(thread1->m_hThread, INFINITE);
WaitForSingleObject(thread2->m_hThread, INFINITE);

, но моя основная проблема связана с этим утверждением в документации: «Если этот дескриптор закрыт, пока ожидание все еще ожидает, поведение функции не определено». Когда закрываются ручки? Завершает ли рабочий процесс закрытие ручки? Если так, я в беде? Это действительно разумное решение ??

1 Ответ

0 голосов
/ 11 июня 2009

Для того, чтобы можно было безопасно ожидать дескриптор потока, необходимо:

  1. Начало потока приостановлено
  2. Установите для элемента m_bAutoDelete значение false, чтобы возвращаемый CWinThread * не удалялся автоматически после выхода из потока
  3. Возобновить поток
  4. И, наконец, подожди на ручке, как ты.

Кроме того, вы можете запустить приостановленный поток, затем продублировать дескриптор, оставить m_bAutoDelete как есть и, наконец, дождаться нового дескриптора. Таким образом, CWinThread * действительно будет удален, но у вас все равно останется ручка для ожидания. Кроме того, не забудьте закрыть ручку, как только вы закончите ждать на ней.

Если вы оставите свой код как есть, вы можете даже не ждать при закрытом дескрипторе. Если поток завершается, вы попадаете в функцию ожидания, указатель CWinThread * может указывать на удаленный объект, и вы получите исключение.

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