Однажды у меня была похожая проблема, хотя и в Visual Basic 6: потоки из приложения могли подключаться к разным серверам, загружать некоторые данные, выполнять некоторые операции с этими циклами и сохранять результат на централизованном сервере.
Затем новым требованием было прекращение потоков из основной формы. Я выполнил это простым, хотя и грязным способом, остановив потоки после N циклов (эквивалентно примерно полсекунде), чтобы попытаться открыть мьютекс с конкретным именем. После успеха они немедленно прекратили все, что делали, и бросили, продолжили в противном случае.
Этот мьютекс был создан только основной формой, после того как все потоки вскоре закроются. Недостатком было то, что пользователю нужно было указать вручную, что он хочет снова запустить потоки - еще одна кнопка «Включить потоки для запуска» сделала это, освободив мьютекс: D
Этот трюк гарантированно работает, поскольку операции мьютекса являются атомарными. Проблема в том, что вы никогда не уверены, что поток действительно закрыт - сбой в логике обработки случая «openMutex преуспел» может означать, что он никогда не закончится. Вы также не знаете, когда / если все потоки закрылись (при условии, что ваш код прав, это займет примерно столько же времени, сколько потребуется циклам для остановки и «прослушивания»).
С моделью многопоточности VB "квартира" довольно сложно отправлять информацию из потоков в основное приложение туда-сюда, гораздо проще "запускать и забывать" или отправлять ее только из основного приложения в нить. Таким образом, необходимость такого рода сокращений. Используя C ++, вы можете свободно использовать свою многопоточную модель, поэтому эти ограничения могут на вас не распространяться.