Я много искал ответа на этот вопрос, но, похоже, его нет.
Я использую Qt 5.2.0 для создания TCP-клиента с winsocks2. Используемый язык — C ++. Чтобы сделать цикл соединения (где я вызываю send () и write ()), я использую QThread (это можно прочитать здесь http://qt-project.org/doc/qt-4.8/qthread.html), до сих пор это работало хорошо, но я хочу быть уверенным, что нет переключения контекста, когда моя программа что-то пишет или читает. Поэтому я подумал, что критические разделы были бы правильным способом сделать это, но в моих поисках в Интернете я не нашел никакого способа сделать это, и даже в официальной документации Qt нет ссылки на критический раздел.
Тогда вот мой вопрос: есть ли способ использовать критические секции в Qt? Нужно ли помещать мьютекс в раздел, который я хочу, чтобы избежать переключения контекста, и размещать мьютексы в других местах? Если утвердительно, в какие части я должен поместить эти мьютексы?
Я извиняюсь за мой английский. Заранее спасибо.
Если есть что-то еще, что я могу сообщить, пожалуйста, скажите мне.
Мурило Г. К.
Тогда вот мой вопрос: есть ли способ использовать критические разделы
в Qt? Нужно ли ставить мьютекс в разделе, который я хочу избегать контекста
переключение
Похоже, вы указываете на критические разделы уровня ядра, а не критические разделы приложения, которые имеют дело только с параллельным выполнением. Критические секции уровня ядра находятся в режиме ядра только и не имеет ничего общего с пользовательскими приложениями. Переключение контекста — идея уровня ядра, а не пользовательский режим.
Если вы спрашиваете о сходстве процессоров, вы должны использовать специальные команды ОС, чтобы установить это. Qt не абстрагируется от сродства процессора. Это единственный способ убедиться, что ваш процесс не будет перепрыгивать между ядрами, когда он запланирован.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686247%28v=vs.85%29.aspx
ПРИМЕЧАНИЕ. Есть очень немного ситуаций, когда эти функции действительно полезны. Современные планировщики уже хотят перепланировать данный поток на том же ядре, на котором он работал до этого, чтобы минимизировать потери в кеше.
Если вы спрашиваете о параллельном доступе к одним и тем же структурам данных несколькими потоками, то QMutex и тому подобное — это то, что вы ищете.
В Qt нет способа реализовать критический раздел без переключения контекста.
Если вы хотите реализовать Critical Section в Qt, просто используйте QReadLocker а также QWriteLocker.
Тогда вот мой вопрос: есть ли способ использовать критические секции в Qt?
Альтернатива Qt будет QMutex
, Обратите внимание, что это, к сожалению, намного медленнее, чем критический раздел Windows. Это одна из главных мрачных причин, почему некоторые клиенты отказываются от использования Qt в своих проектах. Это одна из частей Qt, где она становится значительно медленнее, чем альтернативные решения.
Нужно ли помещать мьютекс в раздел, который я хочу, чтобы избежать переключения контекста, и размещать мьютексы в других местах?
Это был бы самый Qt’ish способ, однако Qt’ish не обязательно означает лучший даже в программном обеспечении Qt. Вы должны судить в каждом конкретном случае в зависимости от вашего точного сценария. Вы должны спросить себя, насколько важна для вас эффективность в этой среде, а также хотите ли вы поддерживать несколько платформ в ближайшем будущем?
Если утвердительно, в какие части я должен поместить эти мьютексы?
Это общий вопрос программирования потоков. Используйте потоковые примитивы, когда им нужно синхронизировать общие ресурсы. Здесь вы можете прочитать немного больше о потоках Qt в целом.
В настоящее время я не уверен, будете ли вы использовать что-либо еще из Qt в своем программном обеспечении, но если да, я бы предложил отказаться от идеи использования Windows API для начинающих, чтобы добиться цели. Вы всегда можете вернуться к нему позже, если использование Qt станет узким местом в вашем проекте.