WIN32: Получение выполнения к другому (данному) потоку

Я ищу способ привести к остатку от запланированного интервала времени выполнения потока к другому потоку. В WINAPI существует функция SwitchToThread, но это не позволяет вызывающей стороне указать поток, на который это хочет переключиться. Я просмотрел MSDN в течение достаточно долгого времени и не нашел ничего, что предложило бы просто это.

Для неспециалиста внутренностей операционной системы как я кажется, что получение потока должно смочь указать, который делает поток это хочет передать выполнение. Это возможно или является этим просто мое воображение?

7
задан Chris Becke 8 January 2010 в 05:26
поделиться

8 ответов

Причина, по которой вы не можете уступить процессорное время назначенному потоку, заключается в том, что Windows имеет вытесняющее ядро планирования , которое в значительной степени возлагает ответственность и полномочия по планированию процессорного времени на ядро и только на ядро.

Поскольку такие потоки не имеют никакого контроля над тем, когда они запускаются, если они запускаются, и еще меньше - над каким потоком они переключаются после того, как их временной срез закончен.

Однако, есть несколько способов влияния на контекстные переключатели:

  • увеличивая приоритет определённого потока, вы можете заставить планировщика планировать его чаще, в ущерб другим потокам (очевидно, применяется и обратное - вы можете снизить приоритет других потоков)

  • вы можете кодировать свой процесс, чтобы поместить потоки в режим ожидания кернела, когда им не нужно будет работать, чтобы помочь планировщику сделать свою работу. При использовании соответствующих конструкций ожидания ядра, таких как Critical Sections, Mutexes, Semaphores и Timers, вы фактически сообщаете ядру, что определенный поток не должен быть запланирован до тех пор, пока не будет выполнена определенная кодировка.

Примечание: Причина, по которой следует подменять приоритеты задач, редко возникает, поэтому ИСПОЛЬЗУЙТЕ С ВНИМАНИЕМ

7
ответ дан 6 December 2019 в 11:49
поделиться

Вы можете использовать 'волокна' вместо 'потоков': например, есть Win32 API с именем SwitchToFiber, который позволяет указать волокно, которое должно быть запланировано.

.
3
ответ дан 6 December 2019 в 11:49
поделиться

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

.
1
ответ дан 6 December 2019 в 11:49
поделиться

Если вы хотите выполнять собственное планирование под Windows, вы можете использовать волокна , которые, по сути, являются потоками, которые вы должны планировать самостоятельно. Однако, учитывая, что вы описываете себя как непрофессионала во внутреннем мире ОС, это, вероятно, было бы плохой идеей, так как волокна - это что-то вроде продвинутой функции.

1
ответ дан 6 December 2019 в 11:49
поделиться

Взгляните на потоки UMS (планирование в пользовательском режиме) в Windows 7

http://msdn.microsoft.com/en-us/library/dd627187 (VS.85) .aspx

2
ответ дан 6 December 2019 в 11:49
поделиться

Это невозможно. Только ядро может решить, какой код будет выполняться следующим, хотя вы можете повлиять на него, уменьшив количество не ожидающих потоков, из которых оно должно выбрать, чтобы запуститься следующим, а также установив приоритеты потоков с помощью SetThreadPriority.

1
ответ дан 6 December 2019 в 11:49
поделиться

Я не думаю, что это возможно, я оглянулся на некоторое время и сдался (тоже хранил XML). Только то, что я могу предложить, - это копирование - вставка между блокнотом и ячейкой.

-121--5086428-

Вторая нить может просто дождаться доходного потока либо путем вызова WAITFOSSINGLEOBJECT () на ее ручку или периодически опрос GetexitCodeThread (). Другие ответы верны об изменении механизмов планирования операционной системы - лучше правильно разработать потоки в первую очередь.

2
ответ дан 6 December 2019 в 11:49
поделиться

Является ли HABTM ответом между тремя классами?

Нет. Вам не нужен HABTM ни в одном из этих отношений.

  • Какова правильная связь между пользователями и вопросами?
  • Какова правильная связь между пользователями и ответами?

В обоих этих случаях это связь «один ко многим»: у пользователя много вопросов и у пользователя много ответов.

С логической точки зрения рассмотрим следующее: Один вопрос никогда не может быть создан несколькими пользователями, и один ответ не может быть создан несколькими пользователями. Таким образом, это не отношение «многие ко многим».

В этом случае, ваши классы должны быть настроены следующим образом:

class User < ActiveRecord::Base
  has_many   :questions
  has_many   :answers
end

class Question < ActiveRecord::Base
  belongs_to :user
  has_many   :answers
end

class Answer < ActiveRecord::Base
  belongs_to :user
  belongs_to :question
end

Если вы, с другой стороны, имеете систему тегов, подобную StackOverflow, вам потребуется отношение HABTM. Один вопрос может иметь много тэги, в то время как один тэг может иметь много вопросов. В качестве примера, ваш пост имеет три тэгов (ruby-on-rails, habtm, foreign-key-relationship), в то время как ruby-on-rails тэг в настоящее время имеют 8546 вопросов.

-121--3995804-

Джеффри, не могли бы вы привести пример того, что вы пытаетесь сделать? Я не вижу вашего пункта, почему/где/как вы хотите смешать 2 контейнера. Если ваш код полностью агностический, то у вас не возникнет никаких проблем с использованием любого контейнера для выполнения проводки.

-121--4780446-

Могу ли я спросить , почему вы хотите использовать SwitchToThread?

Если, например, это какая-то форма, потому что поток x вычисляет некоторое значение, которого нужно дождаться в потоке Y, Тогда я бы предложил взглянуть на библиотеку параллельных образцов или библиотеку асинхронных агентов в Visual Studio 2010, которая позволяет делать это либо с блоками сообщений (получать по асинхронному значению), либо просто с помощью задач: дождаться завершения набора задач и встроить их выполнение во время ожидания...

//i.e. on an arbitrary thread
task_group* tasks;
tasks->run(... / some functor/)

Вызов на tasks- > wait () будет ожидать и включать все выполняющиеся задачи.

0
ответ дан 6 December 2019 в 11:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: