Я ищу способ привести к остатку от запланированного интервала времени выполнения потока к другому потоку. В WINAPI существует функция SwitchToThread, но это не позволяет вызывающей стороне указать поток, на который это хочет переключиться. Я просмотрел MSDN в течение достаточно долгого времени и не нашел ничего, что предложило бы просто это.
Для неспециалиста внутренностей операционной системы как я кажется, что получение потока должно смочь указать, который делает поток это хочет передать выполнение. Это возможно или является этим просто мое воображение?
Причина, по которой вы не можете уступить процессорное время назначенному потоку, заключается в том, что Windows имеет вытесняющее ядро планирования , которое в значительной степени возлагает ответственность и полномочия по планированию процессорного времени на ядро и только на ядро.
Поскольку такие потоки не имеют никакого контроля над тем, когда они запускаются, если они запускаются, и еще меньше - над каким потоком они переключаются после того, как их временной срез закончен.
Однако, есть несколько способов влияния на контекстные переключатели:
увеличивая приоритет определённого потока, вы можете заставить планировщика планировать его чаще, в ущерб другим потокам (очевидно, применяется и обратное - вы можете снизить приоритет других потоков)
вы можете кодировать свой процесс, чтобы поместить потоки в режим ожидания кернела, когда им не нужно будет работать, чтобы помочь планировщику сделать свою работу. При использовании соответствующих конструкций ожидания ядра, таких как Critical Sections, Mutexes, Semaphores и Timers, вы фактически сообщаете ядру, что определенный поток не должен быть запланирован до тех пор, пока не будет выполнена определенная кодировка.
Примечание: Причина, по которой следует подменять приоритеты задач, редко возникает, поэтому ИСПОЛЬЗУЙТЕ С ВНИМАНИЕМ
Вы можете использовать 'волокна' вместо 'потоков': например, есть Win32 API с именем SwitchToFiber, который позволяет указать волокно, которое должно быть запланировано.
.Вы можете использовать регулярные примитивы синхронизации, такие как события, семафоры и т.д., для сериализации двух потоков. Это ни в коем случае не мешает ядру планировать другие потоки между или параллельно на другом ядре процессора, или практически одновременно на том же ядре. Это связано с преимущественной многозадачностью современных операционных систем общего назначения.
.Если вы хотите выполнять собственное планирование под Windows, вы можете использовать волокна , которые, по сути, являются потоками, которые вы должны планировать самостоятельно. Однако, учитывая, что вы описываете себя как непрофессионала во внутреннем мире ОС, это, вероятно, было бы плохой идеей, так как волокна - это что-то вроде продвинутой функции.
Взгляните на потоки UMS (планирование в пользовательском режиме) в Windows 7
http://msdn.microsoft.com/en-us/library/dd627187 (VS.85) .aspx
Это невозможно. Только ядро может решить, какой код будет выполняться следующим, хотя вы можете повлиять на него, уменьшив количество не ожидающих потоков, из которых оно должно выбрать, чтобы запуститься следующим, а также установив приоритеты потоков с помощью SetThreadPriority.
Я не думаю, что это возможно, я оглянулся на некоторое время и сдался (тоже хранил XML). Только то, что я могу предложить, - это копирование - вставка между блокнотом и ячейкой.
-121--5086428-Вторая нить может просто дождаться доходного потока либо путем вызова WAITFOSSINGLEOBJECT () на ее ручку или периодически опрос GetexitCodeThread (). Другие ответы верны об изменении механизмов планирования операционной системы - лучше правильно разработать потоки в первую очередь.
Является ли 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 () будет ожидать и включать все выполняющиеся задачи.