Вопрос CreateThread в c под окном ОС - PullRequest
0 голосов
/ 29 июня 2010

У меня есть следующий код, который инициирует поток.

int iNMHandleThread = 1;
HANDLE hNMHandle = 0;
hNMHandle = CreateThread( NULL, 0, NMHandle, &iNMHandleThread, 0, NULL);
if ( hNMHandle == NULL)
ExitProcess(iNMHandleThread);

Мой вопрос:

  1. Что произойдет, если я выполню этот код, когда поток уже находится в состоянии выполнения.
  2. Я хочу инициировать несколько независимых потоков NMHandle, дайте мне несколько советов, чтобы решить эту проблему.

Ответы [ 3 ]

2 голосов
/ 29 июня 2010

Каждый раз, когда вы вызываете CreateThread, запускается новый поток, который не зависит от других работающих в данный момент потоков. Способна ли ваша функция "NMHandle" работать в нескольких потоках одновременно, зависит от вас: например, зависит ли она от какого-либо глобального состояния?

0 голосов
/ 29 июня 2010
  1. CreateThread создает новый поток.Новый поток, очевидно, не может быть в рабочем состоянии раньше - он не имеет состояния до своего создания.Сравните простое утверждение int i = 42; - не существует предшествующего значения i до 42, потому что объект еще не существует.Очевидно, что старый поток, который вызывает CreateThread(), должен быть запущен - иначе он не смог бы запустить строку, которая вызывает CreateThread()!

  2. Каждый раз, когда вы вызываете CreateThread, вы получитеновая тема.Вы также получите новый дескриптор потока и идентификатор для каждого вызова.Таким образом, вы не можете хранить их все в int iNMHandleThread или HANDLE hNMHandle.Рассмотрим std::list<int> NmThreadIDs и std::list<HANDLE> NmThreadHandles;.

Кроме того, все новые потоки начнутся с вызова NMHandle().Эта функция потокобезопасна?Другими словами, будет ли эта функция работать правильно, если она выполняется двумя потоками одновременно, или с чередованием, или в любом другом случайном порядке?Такие механизмы, как мьютексы и критические секции, могут использоваться для исключения некоторых небезопасных порядков исполнения.

0 голосов
/ 29 июня 2010

Что произойдет, если я выполню этот код, когда поток уже находится в состоянии выполнения.

Другой поток будет запускаться с функцией NMHandle, независимой от другой.

Я хочу инициировать несколько независимых потоков NMHandle, дайте мне несколько советов для решения этой проблемы.

Этот код фактически создает независимый поток.Создайте цикл, если вы хотите создать несколько потоков, выполняющих функцию NMHandle.Если позже вам понадобятся дескрипторы потока (например, ожидание завершения потока), их нужно где-то хранить.

Убедитесь, что NMHandle является потокобезопасным.Если вы не знаете, что это значит, вам не следует начинать многопоточное программирование!

И еще один совет: вы передаете указатель на локальную переменную стека iNMHandleThread в поток.Как только функция вернется, содержимое переменной может больше не иметь ожидаемого значения - вам лучше передать число по значению (CreateThread( NULL, 0, NMHandle, (void*)iNMHandleThread, 0, NULL);).

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