2011-09-20 3 views
2

Я использую CreateThread() для моих 4 потоков.
Я бы хотел запустить все мои потоки одновременно, но дождаться завершения всех 4 до продолжения основного потока.

Я использовал int и увеличил его в начале потока, а затем уменьшил его в конце, а затем в своем основном потоке я использовал цикл while, чтобы удерживать, пока число превышает определенное значение ... однако это didn Кажется, что он работает правильно.

Возможно ли это?Ждите нитей

ответ

1

Вы можете использовать механизм signaled states и функцию WaitForMultipleObjects, чтобы подождать сами события или темы (с указанием их ручками), чтобы достичь состояния сигнализации.

Просто используя одну переменную среди этих потоков, вы, вероятно, сталкиваетесь с проблемами синхронизации, особенно когда они распределены между ядрами вашего процессора.

Если вы хотите изменить общее значение атомарно без использования механизмов синхронизации, используйте функции «Блокировка *», такие как InterlockedIncrement, хотя это не полностью гарантирует отсутствие проблем. Не используйте этот метод в качестве механизма синхронизации в любом случае.

+0

Вам не нужны события, потоки подлежат объектам в Windows. – Hasturkun

+0

Да, я забыл об этом и соответствующим образом изменил ответ. :) – macbirdie

0

Если вы хотите, чтобы ваш главный поток ждет, пока все дочерние потоки не завершить свою работу, то Вы можете использовать:

pthread_join

Edit:

Ах это окно платформа (Я не заметил этого раньше), поэтому вам необходимо использовать,

WaitForMultipleObjects

7

Использование WaitForMultipleObjects с набором bWaitAll флага, на всех ваши резьбы ручек. Функция будет возвращаться после выхода всех потоков.

0

Что вы, скорее всего, захотите сделать, это создать четыре потока, а затем вызвать WaitForSingleObject на четырех возвращенных ручках. Просто убедитесь, что четыре потока выходят с вызовом на ExitThread.

EDIT:

Или, как указано в ответе Hasturkun, используйте WaitForMultipleObjects ... что бы быть умным. :-)

Смежные вопросы