C # асинхронный запуск и возобновление синхронизации потоков

#c# #.net #multithreading

#c# #.net #многопоточность

Вопрос:

я хочу запустить 6 потоков асинхронно, приостановить их и возобновить синхронно…

он должен работать так:

  1. Запуск потока 1 (thr1.start())
  2. Поток 1 некоторый прогресс (получение mac-адресов из txt-файла, инициализация com-объектов)
  3. Поток 1 приостановлен (приостановлен до тех пор, пока все потоки не выполнят то же самое, что и поток 1)
  4. Запуск потока 2
  5. Поток 2 некоторый прогресс
  6. Поток 2 приостановлен
  7. Запуск потока 3
  8. Поток 3 некоторый прогресс
  9. Поток 3 приостановлен
  10. после того, как все 6 потоков приостановлены, они должны возобновить все..

я попробовал с 6 простыми логическими флагами и подождал, пока все они true не станут совсем грязными…

есть идеи?

РЕДАКТИРОВАТЬ (улучшенная визуализация):

 Thr1 | Initiliazing |waiting      |waiting      | Resuming
Thr2 | waiting      |Initiliazing |waiting      | Resuming
Thr3 | waiting      |waiting      |Initiliazing | Resuming
...           
 

спасибо и приветствую,
flux

Комментарии:

1. какова ваша проблемная область — может быть, есть какой-то другой способ ее решения

2. почему бы просто не выполнить все 6 из some progress вашего основного потока, а затем создать дополнительные потоки?

3. потому some progress что это должно быть в каждом потоке .. есть некоторые проблемы с сообщениями, если я инициализирую свои some progress объекты в main

4. они не могут быть инициализированы одновременно.. есть некоторые dll-вызовы, которые не могут быть одновременно.. итак, мне нужно подождать … я отредактировал вопрос

5. Я думаю, люди спрашивают: «Какую работу будут выполнять ваши потоки?»

Ответ №1:

Вам нужна какая-то синхронизация — вероятно, звучит ManualResetEvent для каждого потока, в зависимости от функций вашего потока.


РЕДАКТИРОВАТЬ: Спасибо за ваши обновления — вот простой пример:

 // initComplete is set by each worker thread to tell StartThreads to continue
//     with the next thread
//
// allComplete is set by StartThreads to tell the workers that they have all
//     initialized and that they may all resume


void StartThreads()
{
    var initComplete = new AutoResetEvent( false );
    var allComplete = new ManualResetEvent( false );

    var t1 = new Thread( () => ThreadProc( initComplete, allComplete ) );
    t1.Start();
    initComplete.WaitOne();

    var t2 = new Thread( () => ThreadProc( initComplete, allComplete ) );
    t2.Start();
    initComplete.WaitOne();

    // ...

    var t6 = new Thread( () => ThreadProc( initComplete, allComplete ) );
    t6.Start();
    initComplete.WaitOne();

    // allow all threads to continue
    allComplete.Set();
}


void ThreadProc( AutoResetEvent initComplete, WaitHandle allComplete )
{
    // do init

    initComplete.Set(); // signal init is complete on this thread

    allComplete.WaitOne(); // wait for signal that all threads are ready

    // resume all
}
 

Обратите внимание, что StartThreads метод будет блокироваться во время инициализации потоков — это может быть или не быть проблемой.

Комментарии:

1. можете ли вы привести мне небольшой пример? я понятия не имею, как это реализовать с помощью этого события: ( приветствия

2. Не могли бы вы отредактировать свой вопрос и дать некоторое представление о том, что делают ваши потоки, — тогда я мог бы дать более конкретный ответ.

3. вау , спасибо … похоже, именно то, что я ищу! я постараюсь дать обратную связь! БОЛЬШОЕ СПАСИБО!

4. Нет проблем — не стесняйтесь задавать любые другие вопросы, если вы застряли.