Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Запуск потока

Читайте также:
  1. АВТОМАТИЧЕСКИЙ ЗАПУСК ДИЗЕЛЯ
  2. Вычисление расхода потока по результатам измерения скоростей гидрометрической вертушкой
  3. Запуск Excel.
  4. Запуск автомобиля от вспомогательного аккумулятора (продолжение)
  5. Запуск дизеля.
  6. Запуск и подготовка молочных коров к лактации

Для запуска потока используется функция

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 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.007 сек.)