Синхронизация многопоточной печати с использованием мютекса

CBeginner
Практиковаться сейчас

Введение

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

👀 Предварительный просмотр

$ gcc printer.c -o printer -lpthread
$./printer
helloworld

🎯 Задачи

В этом проекте вы научитесь:

  • Как инициализировать мютекс в функции init()
  • Как заблокировать и разблокировать мютекс в функции printer(), чтобы обеспечить эксклюзивный доступ к процессу печати
  • Как скомпилировать и запустить модифицированную программу, чтобы наблюдать правильный вывод

🏆 Достижения

После завершения этого проекта вы сможете:

  • Разобраться в важности мютекса при синхронизации доступа к общими ресурсам в многопоточной программе
  • Применить методы блокировки и разблокировки мютекса для координации выполнения нескольких потоков
  • Отлаживать и исправлять ошибки в многопоточной программе, чтобы получить ожидаемый вывод

Инициализировать мютекс

В этом шаге вы научитесь инициализировать мютекс в функции init(). Следуйте шагам ниже, чтобы выполнить этот шаг:

  1. Откройте файл printer.c, расположенный в директории /home/labex/project/.
  2. В уже имеющемся коде функции printer мютекс блокируется (pthread_mutex_lock(&mutex)) в начале, чтобы обеспечить эксклюзивный доступ к процессу печати. Как только строка полностью напечатана, мютекс разблокируется (pthread_mutex_unlock(&mutex)), позволяя другому потоку напечатать.
  3. Найдите функцию init() и добавьте следующий код для инициализации мютекса:
void init()
{
    pthread_mutex_init(&mutex, NULL);
}

Это инициализирует переменную mutex с использованием функции pthread_mutex_init(), которая является частью библиотеки POSIX Threads (pthreads). Второй аргумент NULL указывает, что мы используем стандартные атрибуты мютекса.

Компилировать и запускать программу

Теперь, когда вы завершили изменения в файле printer.c, вы можете скомпилировать и запустить программу.

  1. Откройте терминал и перейдите в директорию /home/labex/project/.
  2. Скомпилируйте программу с флагом -lpthread, чтобы связать библиотеку pthreads:
gcc printer.c -o printer -lpthread
  1. Запустите программу:
./printer

Теперь вы должны увидеть вывод:

helloworld

Строки "hello" и "world" напечатываются последовательно без смешивания букв, как ожидалось.

Поздравляем! Вы успешно модифицировали программу "Беспорядочный Шрифтометр", чтобы она работала как задумано.

Резюме

Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.

✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться