Как запустить поток, не дожидаясь ответа в C ++? - PullRequest
2 голосов
/ 14 июля 2011

В цикле for есть вызов CreateThread (), и я хочу, чтобы все потоки запускались один за другим, и каждый поток записывал данные в объект.

      `$while (ii != mapOServs.end())
{
      Array_of_Thread_Handles[i] = CreateThread(NULL,0,MyThread, &args[i] , 0 , NULL);
    }

Но потоки неt запуск, пока он не достигнет WaitForMultipleObjects или WaitForSingleObject.

Как заставить все потоки запускаться один за другим, не ожидая ответа?

Кроме того, какой объект лучше всего использовать, чтобы онмогут быть изменены разными потоками одновременно.

Ответы [ 3 ]

7 голосов
/ 14 июля 2011

Потоки действительно «запускаются» немедленно - Windows создаст необходимые внутренние структуры, выделит стек и т. Д. И добавит их в список выполнения планировщика.Однако они не обязательно будут запланированными немедленно.

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

4 голосов
/ 14 июля 2011

На самом деле все потоки начинаются немедленно. Вы можете записывать в любую структуру данных из потоков, если вы правильно синхронизируете доступ к этой структуре.

2 голосов
/ 14 июля 2011

Кажется, вы застряли во время отладки.Когда вы перешагиваете CreateThread, он может не сразу создавать и запускать поток, поскольку вы отлаживаете в этой точке.Помните, что при активной отладке кода разрешено запускать только один поток, все остальные потоки остаются приостановленными.Когда вы нажимаете F10 или F11, отладчик дает отладчику для запуска, который в конечном итоге просит ОС запустить процесс / потоки для выполнения.Я могу добавить больше, но ваш вопрос требует большего уточнения.

...