Читайте также: |
|
Для запуска потока используется функция
pthread_create(pthread_t *thread, const
pthread_attr_t *attr,
void *(*start_routine) (void *),
void *arg);
Аргументы функции:
thread указатель на pthread_t, где хранится идентификатор потока;
attr – атрибутная запись потока;
start_routine – функция с которой выполняется поток;
arg – параметр, который передается функции start_routine.
Атрибутная запись потока имеет тип данных pthread_attr_t:
typedef struct{
int flags;
size_t stacksize;
void *stackaddr;
void (*exitfunc)(void *status);
int policy;
struct shed_param param;
unsigned guardsize;
} pthread_attr_t;
Поля структуры:
flags – характеристики потока;
stacksize, stackaddr и guardsize – параметры стека;
exitfunc – функция, выполняемая перед завершением потока;
policy и param – параметры диспетчеризации.
Рассмотрим только те поля структуры и функции для работы с ними, которые будут использоваться в дальнейшем.
Инициализация атрибутной записи осуществляется с использованием функции pthread_attr_init(pthread_attr_t *attr).
…
pthread_attr_t attr;
…
pthread_attr_init(&attr)
Атрибуты потока «flags»
Для создания синхронизирующего потока используется вызов pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
Синхронизирующий поток – это поток с завершением которого можно синхронизировать другой поток при помощи функции pthread_join().
Чтобы создать поток синхронизация с завершением которого невозможна необходимо выполнить pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED).
Если необходимо, чтобы поток наследовал атрибуты диспетчеризации от создающего его потока необходимо выполнить pthread_attr_setinheritsched(&attr,PTHREAD_INHERIT_SCHED). В этом случае создаваемый поток наследует дисциплину диспетчеризации и приоритет родительского потока.
Для того чтобы создать поток с параметрами диспетчеризации, указанной в атрибутной записи, необходимо выполнить pthread_attr_setinheritched(&attr,PTHREAD_EXPLICIT_SCHED).
Атрибуты потока «scheduling»(диспетчериация)
Если была выполнена функция pthread_attr_setinheritched(&attr,PTHREAD_EXPLICIT_SCHED), то необходимо указать дисциплину диспетчеризации и приоритет потока. Это выполняется с помощью вызова двух функций:
pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy) – для определения дисциплины диспетчирезации;
att.param.sched_priority – для определения приоритета.
В качестве дисциплины диспетчеризации (параметр policy)может быть или SCHED_FIFO – для планирования по принципу FIFO, или SCHED_RR – для круговой дисциплины планирования.
time_t now;
char buf[27];
pthread_t thread_ids[2];
int threadcount; //счетчик потоков
pthread_attr_t attr;//атрибутная запись потока
pthread_attr_init(&attr);//инициализация атрибутной записи
pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy(&attr,SCHED_RR);//установить круговую дисциплину диспетчеризации
attr.param.sched_priority = 10;//установить приоритет потоков
// thread_ids = malloc(sizeof(pthread_t) *num_thread);
// Создать барьер со значением счетчика 3
pthread_barrier_init(&g_barrier,NULL,g_CountBarrier);//инициализация барьера
// Создать два потока, thread1 thread2
pthread_create(&thread_ids[0],&attr,thread1,(void *) ValThread1);
pthread_create(&thread_ids[1],&attr,thread2,(void *) ValThread2);
// Сейчас выполняются оба потока
// Ждать завершения
time(&now);
printf("main(): wating for barrier, time %s",ctime_r(&now,buf));
pthread_barrier_wait(&g_barrier);
// После этого все потоки завершаются
time(&now);
printf("Barrier in main(), time %s",ctime_r(&now,buf));
// Синхронизироваться с завершением всех потоков
for(threadcount = 0; threadcount < num_thread; threadcount++){
pthread_join(thread_ids[threadcount],NULL);
}
// вывод результатов работы потоков
printf("result thread1 %i\n",ValThread1);
printf("result thread2 %i\n",ValThread2);
return 0;
}
Задание 1
Цель работы — осуществить синхронизацию работы потоков с помощью метода «присоединение».
Дата добавления: 2015-12-08; просмотров: 53 | Нарушение авторских прав