Здравствуйте. Есть много поточное приложение , сервер.
Как сигнализировать операционке (WinServer) о том чтобы не переключаться на другой поток , пока участок кода не будет выполнен.
Ну например:
// тут "обычный" код BEGIN_NOSWITCH_THREAD // <- теперь переключать поток нельзя // блабла ту код выполняющийся до конца без перескакивания на другой поток END_NOSWITCH_THREAD // <- всё .. далее потоки переключаются как обычно ..
Что должно быть в BEGIN_NOSWITCH_THREAD и END_NOSWITCH_THREAD ?
Можно или в виде функции или в виде макроса.
Спасибо .
ksacvet777
Когда я писал проги с использованием MPI (OPEN MPI), там была такая штука: MPI_Barrier.
Она ставит такой барьер, при котором пока все процессы не дойдут в "своём коде" до этого барьера, те которые ещё не дошли до него будут выполняться, а те которые уже дошли, будут ждать "тормозов". Это не то что надо?
Извини, если не в тему, просто гугл на вот это: BEGIN_NOSWITCH_THREAD молчит как партизан ))
видимо потому что это псевдокод ))))
смотри в сторону мьютексов: http://ru.wikipedia.org/wiki/%D0%9C%D1%8C%D1%8E%D1%82%D0%B5%D0%BA%D1%81
вообще нет смысла останавливать потоки, пусть работают, пока не надо будет пользоваться теми же данными, или данными влияющими на эти данные.
Грубо говоря создаешь мьютекс в нужных секциях закрываешь доступ им.
Пример:
функция1
мьютекс[A]->Lock();
код работающий с данными A
мьютекс[A]->Unlock();
мьютекс[Б]->Lock();
код работающий с данными Б
мьютекс[Б]->Unlock();
//тут не лочим секцию, т.к. к данным В мы обращаемся только в функции1
код работающий с данными В
функция2
мьютекс[A]->Lock();
код работающий с данными A
мьютекс[A]->Unlock();
функция3
мьютекс[Б]->Lock();
код работающий с данными Б
мьютекс[Б]->Unlock();
KaronatoR
>Извини, если не в тему, просто гугл на вот это: BEGIN_NOSWITCH_THREAD молчит как партизан ))
:))) дык это ж просто для наглядности..
slava_mib
точно то .. псевдокод
sildc
спасибо . ссылка занятная и ссылки следующие за ней. Только не уверен то ли это что нужно. Возможно это из-за
моего плохого понимания многопоточного приложения.
напиши для чего это тебе надо и на чем реализуешь, проще будет помочь. Просто смысла не вижу блокировать все остальные потоки, которые могут выполнить в это время работу не затрагивающую твоих текущих задач (например, вывод лога в файл параллельно передаче данных по сети)
Возможно стоит копать в сторону волокон (fibers), т.к. управление ими реализует программист, а не диспетчер ОС. Сам, к сожалению, не использовал, поэтому точнее не скажу.
ksacvet777
Может ты имел ввиду критические секции?
http://msdn.microsoft.com/en-us/library/ms682608.aspx
ksacvet777
Блин вот я с утречка затупил)))))))))
Pushkoff
> критические секции
"Критические секции" в WinAPI - это легковесные мьютексы. А топикстартеру нужна "Атомарная операция", но в виндовсе это не выйдет, кроме пары функций.
du_hast
В условиях Win32/64 критическая секция полностью удовлетворяет поставленную топикастером задачу...
Ага, критическая секция это такой оптимизированный мьютекс (mutex), аналог в линуксе - фьютекс (futex).
Ну вдруг он потом еще на линукс полезет, я сразу в кассу :)
Оки , ребятки спасибо за внимание к проблеме ... курю всё ,что вы здесь упомянули ..
Вот ещё одна задача , противоположная предидущей:
допустим поток выполнил всё , что от него требуется .
Как сигнализировать оське (Win32), от том , что этому текущему потоку больше нечего делать и что
требуется переключение на другой поток ?
Использую Sleep(0), но моему это не есть правильно .
ksacvet777
> Как сигнализировать оське (Win32), от том , что этому текущему потоку больше
> нечего делать и что
> требуется переключение на другой поток
делаешь WaitForsingleObject(event)
event - это собственно event, который устанавливаешь в сигнал стейт, когда для потока появится еще работа
ksacvet777
спасибо . через денёк попробую, что получилось отпишусь
Тема в архиве.