Работа с критическими секциями - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Разбираюсь с потоками, пытаюсь сделать синхронизацию:
#include <windows.h>
#include <stdio.h>
CRITICAL_SECTION cs;
HANDLE hThr;
unsigned long uThrID;
 
void Thread( void* pParams )
{ 
    int i, num = 0;
    while (1)
    { 
        EnterCriticalSection( &cs );
        printf("a");
        LeaveCriticalSection( &cs );
        
    }
}
 
int main( void )
{ 
    InitializeCriticalSection( &cs );
    hThr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,NULL,0,&uThrID);
    while(1)
    {
        EnterCriticalSection( &cs );
        printf("b");
        LeaveCriticalSection( &cs );
        
    }
    return 0;
}
Почему потоки выполняются не очередно? На выходе получаем aaababababbb и т.д.

Решение задачи: «Работа с критическими секциями»

textual
Листинг программы
// thread 1
while (1) {
  lock (m1);
  /* make work */
  unlock (m2);
}
 
// thread 2
while (1) {
  lock (m2);
  /* make some work */
  unlock (m1);
}
 
// init
 
init (m1);
init (m2);
lock (m2);
start_thread_1();
start_thread_2();

Объяснение кода листинга программы

В представленном коде реализован пример работы с критическими секциями при помощи мьютексов. Критическая секция — это участок кода, который должен выполняться только одним потоком в единицу времени. В данном примере создаются два потока, которые синхронизированы между собой при помощи двух мьютексов m1 и m2. Каждый из потоков выполняет свою работу, но для того чтобы не возникло гонки данных, доступ к критическим секциям защищен мьютексами. В функции main создаются и инициализируются два мьютекса m1 и m2. Затем выполняется инициализация самих потоков, после чего выполняется запуск потоков. Основная логика работы кода заключается в том, что каждый из потоков выполняет цикл while, который блокирует выполнение других потоков, пока текущий поток не завершит свою работу в критической секции. Для того чтобы выполнить работу в критической секции, поток должен сначала заблокировать другой поток, а затем выполнить свою работу. После выполнения работы, текущий поток должен разблокировать другой поток, чтобы тот мог продолжить свою работу. Таким образом, в данном примере реализована простая система критических секций, которая позволяет двум потокам синхронно выполнять свою работу без гонок данных.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5
Похожие ответы