Я изучаю программирование с помощью pthreads. Как я могу записать программу для печати нечетных чисел и четных чисел на отдельных потоках.
Передайте значение индикатора, чтобы указать, должен ли поток печатать нечетное или четное число через аргумент функции потока.
В зависимости от того же, начните с 0 (для четных чисел) или 1 (для нечетных чисел) и продолжайте увеличивать на 2 как в потоках, так и в печати.
Вы также можете распечатать идентификатор потока вместе с номером, чтобы указать, какая из ниток что печатает.
Я полагаю, вы знаете, как использовать pthreads.
[Обновление]: ссылка для pthreads Даже при использовании семафоров или мьютексов вам трудно получить вывод в порядке 1,2,3 и т. д., поскольку вы никогда не знаете, какой поток получит возможность выполнить первым. Для этого вам, возможно, придется использовать некоторые расширенные концепции, такие как приоритет потока или межпотоковое взаимодействие с использованием условных переменных. Это всего лишь намеки. Надеюсь, если вы пройдете по ссылке, вы получите больше информации.
Вам нужны два объекта синхронизации, такие как семафор или переменная состояния. Идея заключается в том, что поток A запрашивает семафор A до печати и освобождает семафор B после, в то время как поток B делает обратное.
Идея заключается в том, что после того, как поток A запросит семафор A, он сбросит семафор до 0. В следующий раз, когда он запросит семафор A, он будет блокироваться, пока поток B не освободит семафор.
В псевдокоде это выглядит так:
initialization:
// set semA to 1 so that the call to sem_wait in the
// even thread will succeed right away
sem_init(semA, 1)
sem_init(semB, 0)
even_thread:
to_print = 0;
loop:
sem_wait(semA);
write(to_print);
to_print += 2
sem_post(semB)
odd_thread:
to_print = 1
loop:
sem_wait(semB)
write(to_print)
to_print += 2
sem_post(semA)
Поскольку вы хотите научить себя программированию потоков, я предоставлю вам возможность преобразовать это в реальный код pthreads.