Войти
ПрограммированиеФорумСеть

Многопоточное приложение: Как запретить переключение на другой поток ?

Страницы: 1 2 Следующая »
#0
7:00, 16 июня 2009

Здравствуйте.  Есть много поточное приложение , сервер. 
Как сигнализировать операционке (WinServer) о том чтобы не переключаться на другой поток , пока участок кода не будет выполнен.
Ну например:

 // тут "обычный"  код

  BEGIN_NOSWITCH_THREAD // <- теперь переключать поток нельзя

 // блабла ту код выполняющийся до конца без перескакивания на другой поток

  END_NOSWITCH_THREAD // <- всё .. далее потоки переключаются  как обычно ..

Что должно быть в BEGIN_NOSWITCH_THREAD  и END_NOSWITCH_THREAD ?

Можно или в виде функции или в виде макроса.
Спасибо .


#1
8:30, 16 июня 2009

ksacvet777
Когда я писал проги с использованием MPI (OPEN MPI), там была такая штука: MPI_Barrier.
Она ставит такой барьер, при котором пока все процессы не дойдут в "своём коде" до этого барьера, те которые ещё не дошли до него будут выполняться, а те которые уже дошли, будут ждать "тормозов". Это не то что надо?
Извини, если не в тему, просто гугл на вот это: BEGIN_NOSWITCH_THREAD молчит как партизан ))

#2
8:50, 16 июня 2009

видимо потому что это псевдокод ))))

#3
9:14, 16 июня 2009

смотри в сторону мьютексов: 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();

#4
10:01, 16 июня 2009

KaronatoR
      >Извини, если не в тему, просто гугл на вот это: BEGIN_NOSWITCH_THREAD молчит как партизан ))
:)))  дык это ж просто  для наглядности..

slava_mib
точно то ..  псевдокод

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

#5
10:10, 16 июня 2009

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

#6
11:02, 16 июня 2009

Возможно стоит копать в сторону волокон (fibers), т.к. управление ими реализует программист, а не диспетчер ОС. Сам, к сожалению, не использовал, поэтому точнее не скажу.

#7
12:13, 16 июня 2009

ksacvet777
Может ты имел ввиду критические секции?
http://msdn.microsoft.com/en-us/library/ms682608.aspx

#8
15:05, 16 июня 2009

ksacvet777
Блин вот я с утречка затупил)))))))))

#9
15:40, 16 июня 2009

Pushkoff
> критические секции

"Критические секции" в WinAPI - это легковесные мьютексы. А топикстартеру нужна "Атомарная операция", но в виндовсе это не выйдет, кроме пары функций.

#10
19:48, 16 июня 2009

du_hast
В условиях Win32/64 критическая секция полностью удовлетворяет поставленную топикастером задачу...

#11
20:04, 16 июня 2009

Ага, критическая секция это такой оптимизированный мьютекс (mutex), аналог в линуксе - фьютекс (futex).
Ну вдруг он потом еще на линукс полезет, я сразу в кассу :)

#12
22:16, 16 июня 2009

Оки , ребятки спасибо за внимание к проблеме ... курю всё ,что вы здесь упомянули ..

Вот ещё одна задача , противоположная предидущей:
 
допустим поток выполнил  всё , что от него требуется .
    Как сигнализировать оське (Win32),  от том , что этому текущему потоку больше нечего делать и  что
требуется переключение на другой поток ? 

Использую Sleep(0), но моему это не есть правильно .

#13
22:24, 16 июня 2009

ksacvet777
> Как сигнализировать оське (Win32), от том , что этому текущему потоку больше
> нечего делать и что
> требуется переключение на другой поток
делаешь WaitForsingleObject(event) 
event - это собственно event, который устанавливаешь в сигнал стейт, когда для потока появится еще работа

#14
15:34, 17 июня 2009

ksacvet777
спасибо . через денёк попробую, что получилось отпишусь

Страницы: 1 2 Следующая »
ПрограммированиеФорумСеть

Тема в архиве.