Каковы различия между механизмами блокировки для многопоточных и многопроцессорных приложений? - PullRequest
0 голосов
/ 15 января 2012

У меня есть кусок кода, который решает проблему многопоточности (с общими ресурсами), например:

CRITICAL_SECTION gCS;
InitializeCriticalSection(&gCS);

EnterCriticalSection(&gCS);
// Do some shared resources stuff 
LeaveCriticalSection(&gCS);

В на этой странице MSDN написано: «Потоки одного процесса [my bold] могут использовать объект критического раздела для синхронизации взаимного исключения».

Итак, мой вопрос: как насчет случая, когда операционная система решает разделить потоки на разные процессы или даже разные процессоры.

Действительно ли EnterCriticalSection не выполняет работу? И если ответ «критические разделы не помогают при многократной обработке», какова альтернатива?

Я предпочитаю не использовать классы Boost.

Ответы [ 4 ]

4 голосов
/ 15 января 2012

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

Различные процессоры - критические разделы охватывают это.

Разные процессы - вам нужен разный API синхронизации , который может совместно использовать объекты [ядра] между процессами, например мьютексы и семафоры .

См. Пример использования в Использование объектов Mutex section.

4 голосов
/ 15 января 2012

Операционная система не будет делить поток на разные процессы.

EnterCriticalSection подходит для программ с несколькими потоками, а также для систем с несколькими процессорами.

2 голосов
/ 15 января 2012

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

0 голосов
/ 15 января 2012
  1. Процессу назначено новое адресное пространство (стек и куча), тогда как при создании потока ему неявно назначается пространство памяти процесса инициатора, но для вновь выделенного собственного пространства стека (новый стек)пространство присваивается каждому отдельному потоку)

  2. для ОС поток выполняется так же, как и процесс, естественно, при использовании потоков это может привести к увеличению кеша и памяти \ страницыhit.

  3. исполнитель ОС даст время процессу, который затем может использовать свой собственный планировщик для разделения времени между своими потоками, но это не обязательно, так как все потоки являются процессами, которыми они являютсяв одной и той же таблице процессов и может работать на любом ядре одновременно \ в любое время, так же, как обычный процесс.

  4. , поскольку потоки (для одного и того же процесса) имеют одинаковую память, которую они могут синхронизироватьна переменные \ блокировать объекты на уровень пользователя

  5. процесс не должен иметь доступа к другому процессувыделенная память (если он не является потоком объединенного пространства), поэтому синхронизацию между процессами следует выполнять в некотором объединенном \ глобальном пространстве или на уровне ядра

...