Unix - статьи



         

Средства синхронизации потоков


Изучая взаимодействие между процессами, мы много внимания уделили средствам синхронизации процессов. У потоков тоже есть свои специальные средства синхронизации. Вернемся к первому примеру из предыдущей статьи, - программе threads. Напомню, что в том примере мы создавали два потока, используя одну и ту же функцию потока. В процессе создания каждого потока этой функции передавалось целочисленное значение (номер потока). При этом для передачи значения каждому потоку использовалась своя переменная. В той статье я подробно объяснил, почему использование одной и той же переменной для передачи значения функциям разных потоков может привести к ошибке.

Коротко говоря, - проблема заключалась в том, что мы не могли знать, когда именно новый поток начнет выполняться. С помощью средств синхронизации потоков мы можем решить эту проблему и использовать одну переменную для передачи значений обоим потокам. Рассмотрим модифицированный вариант программы threads, программу threads2 (вы найдете ее в в файле threads2.c).

#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <pthread.h> #include <semaphore.h> sem_t sem; void * thread_func(void *arg) { int i; int loc_id = * (int *) arg; sem_post(&sem); for (i = 0; i < 4; i++) { printf("Thread %i is running\n", loc_id); sleep(1); } } int main(int argc, char * argv[]) { int id, result; pthread_t thread1, thread2; id = 1; sem_init(&sem, 0, 0); result = pthread_create(&thread1, NULL, thread_func, &id); if (result != 0) { perror("Creating the first thread"); return EXIT_FAILURE; } sem_wait(&sem); id = 2; result = pthread_create(&thread2, NULL, thread_func, &id); if (result != 0) { perror("Creating the second thread"); return EXIT_FAILURE; } result = pthread_join(thread1, NULL); if (result != 0) { perror("Joining the first thread"); return EXIT_FAILURE; } result = pthread_join(thread2, NULL); if (result != 0) { perror("Joining the second thread"); return EXIT_FAILURE; } sem_destroy(&sem); printf("Done\n"); return EXIT_SUCCESS; }




Содержание  Назад  Вперед