🗊Презентация Fork

Категория: Образование
Нажмите для полного просмотра!
Fork, слайд №1Fork, слайд №2Fork, слайд №3Fork, слайд №4Fork, слайд №5Fork, слайд №6Fork, слайд №7Fork, слайд №8Fork, слайд №9Fork, слайд №10Fork, слайд №11Fork, слайд №12Fork, слайд №13Fork, слайд №14Fork, слайд №15Fork, слайд №16Fork, слайд №17Fork, слайд №18Fork, слайд №19Fork, слайд №20Fork, слайд №21

Вы можете ознакомиться и скачать презентацию на тему Fork. Доклад-сообщение содержит 21 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1


Fork, слайд №1
Описание слайда:

Слайд 2


Fork, слайд №2
Описание слайда:

Слайд 3





signal(SIGCHLD,reaper);
signal(SIGCHLD,reaper);
while(1) {
        ssock = accept(msock,(struct sockaddr *)&fsin,&len);
            if(ssock <0){ /* Сообщение об ошибке */ } 
            switch(fork()) {
                   case(0):                                                                                                                                                                                                                                                                                                                                                                               
                            close(msock);
                               /* Обработка поступившго запроса ведомым процессом */
                                 close(ssock);
                                 exit(0);
                   default:                                                                                                                                                                                                                                                                                                                                                       
                               close(ssock);
                                   /* Ведущий процесс */
                                   break;
                   case -1:
                              /* Сообщение об ошибке */                    
                      }
              }
void reaper(int sig)
{int status;
while(wait3(&status,WNOHANG,(struct rusage *)0)>= 0);
}
Описание слайда:
signal(SIGCHLD,reaper); signal(SIGCHLD,reaper); while(1) { ssock = accept(msock,(struct sockaddr *)&fsin,&len); if(ssock <0){ /* Сообщение об ошибке */ } switch(fork()) { case(0): close(msock); /* Обработка поступившго запроса ведомым процессом */ close(ssock); exit(0); default: close(ssock); /* Ведущий процесс */ break; case -1: /* Сообщение об ошибке */ } } void reaper(int sig) {int status; while(wait3(&status,WNOHANG,(struct rusage *)0)>= 0); }

Слайд 4


Fork, слайд №4
Описание слайда:

Слайд 5





int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

	После создания нового потока в нем начинается выполняться функция (которая называется потоковой функцией), переданная параметром start_routine, причем ей самой в качестве первого параметра передается переменная arg. Параметр attr позволяет задать атрибуты потока (NULL для значений по умолчанию). thread -- адрес переменной, в которую pthread_create() записывает идентификатор созданного потока. Созданный с помощью pthread_create() поток будет работать параллельно с существующими. Возвращается 0 в случае успеха и не ноль -- в противоположном случае. Потоковая функция start_routine имеет прототип: 
void* my_thread_function(void *);

    	Поскольку как параметр, так и ее возвращаемое значение -- указатели, то функция может принимать в качестве параметра и возвращать любую информацию.
Описание слайда:
int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); После создания нового потока в нем начинается выполняться функция (которая называется потоковой функцией), переданная параметром start_routine, причем ей самой в качестве первого параметра передается переменная arg. Параметр attr позволяет задать атрибуты потока (NULL для значений по умолчанию). thread -- адрес переменной, в которую pthread_create() записывает идентификатор созданного потока. Созданный с помощью pthread_create() поток будет работать параллельно с существующими. Возвращается 0 в случае успеха и не ноль -- в противоположном случае. Потоковая функция start_routine имеет прототип: void* my_thread_function(void *); Поскольку как параметр, так и ее возвращаемое значение -- указатели, то функция может принимать в качестве параметра и возвращать любую информацию.

Слайд 6





Выполнение потока завершается в двух случаях: если завершено выполнение потоковой функции, или при выполнении функции pthread_exit(): 
Выполнение потока завершается в двух случаях: если завершено выполнение потоковой функции, или при выполнении функции pthread_exit(): 
void pthread_exit(void *retval);

     которая завершает выполнение вызвавшего ее потока. Аргумент retval -- это код с которым завершается выполнение потока. При завершении работы потока вы должны помнить, что pthread_exit() не закрывает файлы и все открытые потоком файлы будут оставаться открытыми даже после его завершения, так что не забывайте подчищать за собой. Если вы завершите выполнение функции main() с помощью pthread_exit(), выполнение порожденных ранее потоков продолжится.
Описание слайда:
Выполнение потока завершается в двух случаях: если завершено выполнение потоковой функции, или при выполнении функции pthread_exit(): Выполнение потока завершается в двух случаях: если завершено выполнение потоковой функции, или при выполнении функции pthread_exit(): void pthread_exit(void *retval); которая завершает выполнение вызвавшего ее потока. Аргумент retval -- это код с которым завершается выполнение потока. При завершении работы потока вы должны помнить, что pthread_exit() не закрывает файлы и все открытые потоком файлы будут оставаться открытыми даже после его завершения, так что не забывайте подчищать за собой. Если вы завершите выполнение функции main() с помощью pthread_exit(), выполнение порожденных ранее потоков продолжится.

Слайд 7





Потоки, как и порожденные процессы, по завершению работы сами по себе не освобождают ресурсы, занятые собой для личного пользования (а именно дескриптор и стек) :-) . Поэтому им необходимо помочь. 
Потоки, как и порожденные процессы, по завершению работы сами по себе не освобождают ресурсы, занятые собой для личного пользования (а именно дескриптор и стек) :-) . Поэтому им необходимо помочь. 
	Варианта, собственно, два: либо на ряду с освобождением ресурсов какой-либо поток ждет его завершения, либо нет.
     Для первого варианта используем функцию pthread_join(): 
 int pthread_join(pthread_t th, void **thread_return);

     которая приостанавливает выполнение вызвавшего ее процесса до тех пор, пока поток, определенный параметром th, не завершит свое выполнение и если параметр thread_return не будет равен NULL, то запишет туда возвращенное потоком значение (которое будет равным либо PTHREAD_CANCELED, если поток был отменен, либо тем значением, которое было передано через аргумент функции pthread_exit()).
Описание слайда:
Потоки, как и порожденные процессы, по завершению работы сами по себе не освобождают ресурсы, занятые собой для личного пользования (а именно дескриптор и стек) :-) . Поэтому им необходимо помочь. Потоки, как и порожденные процессы, по завершению работы сами по себе не освобождают ресурсы, занятые собой для личного пользования (а именно дескриптор и стек) :-) . Поэтому им необходимо помочь. Варианта, собственно, два: либо на ряду с освобождением ресурсов какой-либо поток ждет его завершения, либо нет. Для первого варианта используем функцию pthread_join(): int pthread_join(pthread_t th, void **thread_return); которая приостанавливает выполнение вызвавшего ее процесса до тех пор, пока поток, определенный параметром th, не завершит свое выполнение и если параметр thread_return не будет равен NULL, то запишет туда возвращенное потоком значение (которое будет равным либо PTHREAD_CANCELED, если поток был отменен, либо тем значением, которое было передано через аргумент функции pthread_exit()).

Слайд 8





Для второго варианта есть функция pthread_detach() : 
Для второго варианта есть функция pthread_detach() : 
int pthread_detach(pthread_t th);

	которая делает поток th "открепленным" (detached). Это значит, что после того, как он завершится, он сам освободит все занятые ним ресурсы. 
	
	Обратите внимание на то, что нельзя ожидать завершения detached-потока (то есть функция pthread_join выполненная для detached потока завершится с ошибкой).
Описание слайда:
Для второго варианта есть функция pthread_detach() : Для второго варианта есть функция pthread_detach() : int pthread_detach(pthread_t th); которая делает поток th "открепленным" (detached). Это значит, что после того, как он завершится, он сам освободит все занятые ним ресурсы. Обратите внимание на то, что нельзя ожидать завершения detached-потока (то есть функция pthread_join выполненная для detached потока завершится с ошибкой).

Слайд 9





Cоздание потоков позволяет им совместно использовать некоторые ресурсы, но нужно производить контроль на предмет эксклюзивности доступа к этим ресурсам (нельзя допускать одновременной записи в одну переменную, например). 
Cоздание потоков позволяет им совместно использовать некоторые ресурсы, но нужно производить контроль на предмет эксклюзивности доступа к этим ресурсам (нельзя допускать одновременной записи в одну переменную, например). 
	
	Такой контроль можно вести тремя способами через: 

взаимоисключающую блокировку 
условные переменные 
Семафоры
Описание слайда:
Cоздание потоков позволяет им совместно использовать некоторые ресурсы, но нужно производить контроль на предмет эксклюзивности доступа к этим ресурсам (нельзя допускать одновременной записи в одну переменную, например). Cоздание потоков позволяет им совместно использовать некоторые ресурсы, но нужно производить контроль на предмет эксклюзивности доступа к этим ресурсам (нельзя допускать одновременной записи в одну переменную, например). Такой контроль можно вести тремя способами через: взаимоисключающую блокировку условные переменные Семафоры

Слайд 10





Первый вариант представляется самим набором функций библиотеки POSIX Threads. Взаимоисключающая блокировка представляется в программе переменной типа pthread_mutex_t. 
Первый вариант представляется самим набором функций библиотеки POSIX Threads. Взаимоисключающая блокировка представляется в программе переменной типа pthread_mutex_t. 
	Для работы с ними существует 5 функций, а именно: 
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
	которая инициализирует блокировку, заданную параметром mutex. Соответственно, mutexattr -- ее атрибуты. Значение NULL соответствует установкам по умолчанию. 
int pthread_mutex_destroy(pthread_mutex_t *mutex);
	удаляет блокировку mutex
Описание слайда:
Первый вариант представляется самим набором функций библиотеки POSIX Threads. Взаимоисключающая блокировка представляется в программе переменной типа pthread_mutex_t. Первый вариант представляется самим набором функций библиотеки POSIX Threads. Взаимоисключающая блокировка представляется в программе переменной типа pthread_mutex_t. Для работы с ними существует 5 функций, а именно: int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); которая инициализирует блокировку, заданную параметром mutex. Соответственно, mutexattr -- ее атрибуты. Значение NULL соответствует установкам по умолчанию. int pthread_mutex_destroy(pthread_mutex_t *mutex); удаляет блокировку mutex

Слайд 11





int pthread_mutex_lock(pthread_mutex_t *mutex)
int pthread_mutex_lock(pthread_mutex_t *mutex)

     устанавливает блокировку mutex. Если mutex не была заблокирована, то она его ее и немедленно завершается. Если же нет, то функция приостанавливает работы вызвавшего ее потока до разблокировки mutex, а после этого выполняет аналогичные действия. 
int pthread_mutex_unlock(pthread_mutex_t *mutex)

     снимает блокировку mutex. Подразумевается, что эта функция будет вызвана тем же потоком, который ее заблокировал (через pthread_mutex_lock()). 
int pthread_mutex_trylock(pthread_mutex_t *mutex)

     ведет себя аналогично pthread_mutex_lock() за исключением того, что она не приостанавливает вызывающий поток, если блокировка mutex установлена, а просто завершается с кодом EBUSY.
Описание слайда:
int pthread_mutex_lock(pthread_mutex_t *mutex) int pthread_mutex_lock(pthread_mutex_t *mutex) устанавливает блокировку mutex. Если mutex не была заблокирована, то она его ее и немедленно завершается. Если же нет, то функция приостанавливает работы вызвавшего ее потока до разблокировки mutex, а после этого выполняет аналогичные действия. int pthread_mutex_unlock(pthread_mutex_t *mutex) снимает блокировку mutex. Подразумевается, что эта функция будет вызвана тем же потоком, который ее заблокировал (через pthread_mutex_lock()). int pthread_mutex_trylock(pthread_mutex_t *mutex) ведет себя аналогично pthread_mutex_lock() за исключением того, что она не приостанавливает вызывающий поток, если блокировка mutex установлена, а просто завершается с кодом EBUSY.

Слайд 12





Поток выполнения представляет собой один из принципов организации отдельных вычислений, а один процесс может содержать от одного и более потоков. 
Поток выполнения представляет собой один из принципов организации отдельных вычислений, а один процесс может содержать от одного и более потоков. 
Новый поток может быть создан в любое время путем вызова функции pthread_create. 
Операционная система ограничивает максимально допустимое количество параллельных потоков, также как и максимальное количество параллельных процессов. 
Все потоки процесса разделяют единый набор глобальных переменных и единый набор дескрипторов файлов.
Многопотоковые процессы обладают двумя основными преимуществами по сравнению с однопотоковыми процессами:
 более высокая эффективность и разделяемая память. 
	
	Повышение эффективности связано с уменьшением издержек на переключение контекста.
Описание слайда:
Поток выполнения представляет собой один из принципов организации отдельных вычислений, а один процесс может содержать от одного и более потоков. Поток выполнения представляет собой один из принципов организации отдельных вычислений, а один процесс может содержать от одного и более потоков. Новый поток может быть создан в любое время путем вызова функции pthread_create. Операционная система ограничивает максимально допустимое количество параллельных потоков, также как и максимальное количество параллельных процессов. Все потоки процесса разделяют единый набор глобальных переменных и единый набор дескрипторов файлов. Многопотоковые процессы обладают двумя основными преимуществами по сравнению с однопотоковыми процессами: более высокая эффективность и разделяемая память. Повышение эффективности связано с уменьшением издержек на переключение контекста.

Слайд 13





Переключение контекста – 
Переключение контекста – 

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

Слайд 14





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

Слайд 15





Еще один недостаток связан с отсутствием надежности. 
Еще один недостаток связан с отсутствием надежности. 
		
		Если одна из параллельно работающих копий однопотокового сервера вызовет серьезную ошибку (например, в ней будет выполнена ссылка на недопустимую область памяти), то операционная система завершит только тот процесс, который вызвал ошибку. С другой стороны, если серьезная ошибка будет вызвана одним из потоков многопотокового сервера, то операционная система завершит весь процесс (т.е. все потоки этого процесса).
Описание слайда:
Еще один недостаток связан с отсутствием надежности. Еще один недостаток связан с отсутствием надежности. Если одна из параллельно работающих копий однопотокового сервера вызовет серьезную ошибку (например, в ней будет выполнена ссылка на недопустимую область памяти), то операционная система завершит только тот процесс, который вызвал ошибку. С другой стороны, если серьезная ошибка будет вызвана одним из потоков многопотокового сервера, то операционная система завершит весь процесс (т.е. все потоки этого процесса).

Слайд 16





struct {pthread_mutex_t st_mutex;   /* Разделяемая переменная */
struct {pthread_mutex_t st_mutex;   /* Разделяемая переменная */
} GLOBAL;
int main() {
pthread_t    th;
pthread_attr_t    ta;
/* Создаем ведущий сокет, привязываем его к общепринятому порту и переводим в пассивный режим */
pthread_attr_init(&ta);
pthread_attr_setdetachstate(&ta, PTHREAD_CREATE_DETACHED);
pthread_mutex_init(&GLOBAL.st_mutex,0);
while (1)  {ssock = accept(msock,  (struct sockaddr *)&fsin, &len);
if (ssock <0)  {/* ошибка */}
if (pthread_create(&th, &ta, (void * (*)(void *))handler, (void *)ssock) <0) {/* ошибка */}
}
int handler(int ssock)
{pthread_mutex_lock(&GLOBAL.st_mutex);
/* выполнение операций с разделяемыми переменными */
pthread_mutex_unlock(&GLOBAL.st mutex);
return 0;
}
Описание слайда:
struct {pthread_mutex_t st_mutex; /* Разделяемая переменная */ struct {pthread_mutex_t st_mutex; /* Разделяемая переменная */ } GLOBAL; int main() { pthread_t th; pthread_attr_t ta; /* Создаем ведущий сокет, привязываем его к общепринятому порту и переводим в пассивный режим */ pthread_attr_init(&ta); pthread_attr_setdetachstate(&ta, PTHREAD_CREATE_DETACHED); pthread_mutex_init(&GLOBAL.st_mutex,0); while (1) {ssock = accept(msock, (struct sockaddr *)&fsin, &len); if (ssock <0) {/* ошибка */} if (pthread_create(&th, &ta, (void * (*)(void *))handler, (void *)ssock) <0) {/* ошибка */} } int handler(int ssock) {pthread_mutex_lock(&GLOBAL.st_mutex); /* выполнение операций с разделяемыми переменными */ pthread_mutex_unlock(&GLOBAL.st mutex); return 0; }

Слайд 17





Аргумент attr содержит атрибуты, присваиваемые вновь создаваемому потоку. Значение аргумента может быть равно NULL, если новый поток должен использовать атрибуты, принятые системой по умолчанию, или адрес объекта содержит атрибуты. Объект, содержащий атрибуты, может быть связан с несколькими потоками. 
Аргумент attr содержит атрибуты, присваиваемые вновь создаваемому потоку. Значение аргумента может быть равно NULL, если новый поток должен использовать атрибуты, принятые системой по умолчанию, или адрес объекта содержит атрибуты. Объект, содержащий атрибуты, может быть связан с несколькими потоками. 
Функция pthread_attr_init создает объект, содержащий атрибуты, а функция phread_attr_destroy удаляет такой объект:
	#include <pthread.h>
	Int pthread_attr_init(pthread_attr_t*  attr_p);
	Int pthread_attr_destroy(pthread_attr_t*  attr_p);

Атрибуты объекта, созданного функцией pthread_attr_init, можно проверить функцией pthread_attr_get, или установить функцией pthread_attr_set .
Например,  состояние отсоединения 
     API для проверки  - pthread_attr_getdetachstate
     API для установки - pthread_attr_setdetachstate
Описание слайда:
Аргумент attr содержит атрибуты, присваиваемые вновь создаваемому потоку. Значение аргумента может быть равно NULL, если новый поток должен использовать атрибуты, принятые системой по умолчанию, или адрес объекта содержит атрибуты. Объект, содержащий атрибуты, может быть связан с несколькими потоками. Аргумент attr содержит атрибуты, присваиваемые вновь создаваемому потоку. Значение аргумента может быть равно NULL, если новый поток должен использовать атрибуты, принятые системой по умолчанию, или адрес объекта содержит атрибуты. Объект, содержащий атрибуты, может быть связан с несколькими потоками. Функция pthread_attr_init создает объект, содержащий атрибуты, а функция phread_attr_destroy удаляет такой объект: #include <pthread.h> Int pthread_attr_init(pthread_attr_t* attr_p); Int pthread_attr_destroy(pthread_attr_t* attr_p); Атрибуты объекта, созданного функцией pthread_attr_init, можно проверить функцией pthread_attr_get, или установить функцией pthread_attr_set . Например, состояние отсоединения API для проверки - pthread_attr_getdetachstate API для установки - pthread_attr_setdetachstate

Слайд 18





#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <pthread.h>
#include <unistd.h>
#include <time.h>
#define NTHRDS 2  /* К этим ресурсам мы можем получить   доступ из потока */
char words[8000][20]; // Словарь
int current, maxw;
char foundpass; // Флажок
pthread_mutex_t mutexpass, mutexfound; /* Блокировки */
void *passhack(void *hash)
int main(int argc, char **argv) 
{  
char i, *pass;  
FILE *passfile;
Описание слайда:
#include <stdio.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <pthread.h> #include <unistd.h> #include <time.h> #define NTHRDS 2 /* К этим ресурсам мы можем получить доступ из потока */ char words[8000][20]; // Словарь int current, maxw; char foundpass; // Флажок pthread_mutex_t mutexpass, mutexfound; /* Блокировки */ void *passhack(void *hash) int main(int argc, char **argv) { char i, *pass; FILE *passfile;

Слайд 19





pthread_t thrds[NTHRDS];   // Потоки  
pthread_t thrds[NTHRDS];   // Потоки  
pass = (char *)malloc(35); 
pthread_mutex_init(&mutexpass, NULL); /* Инициализация блокировок */  
pthread_mutex_init(&mutexfound, NULL);  
strcpy(pass, argv[1]);  /* Читаем словарь в память */
strcpy(pass, argv[1]);  /* Читаем словарь в память */  
passfile = fopen(argv[2], "r");  
maxw = 0;  
    while (!feof(passfile))  fgets(words[maxw++], 20, passfile);  
                     fclose(passfile);   
    foundpass = 0;            
/* Запускаем потоки */  
for (i=0;i < NTHRDS;i++)    
            pthread_create(&thrds[i], NULL, passhack, (void *) pass); 
                           /* И ждем завершения их работы */  
    for (i=0;i < NTHRDS;i++)    
               pthread_join(thrds[i], NULL);
  
/* Освобождаем блокировки */ 
   pthread_mutex_destroy(&mutexpass);  
   pthread_mutex_destroy(&mutexfound);  
         return 0;
}
Описание слайда:
pthread_t thrds[NTHRDS]; // Потоки pthread_t thrds[NTHRDS]; // Потоки pass = (char *)malloc(35); pthread_mutex_init(&mutexpass, NULL); /* Инициализация блокировок */ pthread_mutex_init(&mutexfound, NULL); strcpy(pass, argv[1]); /* Читаем словарь в память */ strcpy(pass, argv[1]); /* Читаем словарь в память */ passfile = fopen(argv[2], "r"); maxw = 0; while (!feof(passfile)) fgets(words[maxw++], 20, passfile); fclose(passfile); foundpass = 0; /* Запускаем потоки */ for (i=0;i < NTHRDS;i++) pthread_create(&thrds[i], NULL, passhack, (void *) pass); /* И ждем завершения их работы */ for (i=0;i < NTHRDS;i++) pthread_join(thrds[i], NULL); /* Освобождаем блокировки */ pthread_mutex_destroy(&mutexpass); pthread_mutex_destroy(&mutexfound); return 0; }

Слайд 20





Аргумент attr содержит атрибуты, присваиваемые вновь создаваемому потоку. Значение аргумента может быть равно NULL, если новый поток должен использовать атрибуты, принятые системой по умолчанию, или адрес объекта содержит атрибуты. Объект, содержащий атрибуты, может быть связан с несколькими потоками. 
Аргумент attr содержит атрибуты, присваиваемые вновь создаваемому потоку. Значение аргумента может быть равно NULL, если новый поток должен использовать атрибуты, принятые системой по умолчанию, или адрес объекта содержит атрибуты. Объект, содержащий атрибуты, может быть связан с несколькими потоками. 
Функция pthread_attr_init создает объект, содержащий атрибуты, а функция phread_attr_destroy удаляет такой объект:
	#include <pthread.h>
	Int pthread_attr_init(pthread_attr_t*  attr_p);
	Int pthread_attr_destroy(pthread_attr_t*  attr_p);
Описание слайда:
Аргумент attr содержит атрибуты, присваиваемые вновь создаваемому потоку. Значение аргумента может быть равно NULL, если новый поток должен использовать атрибуты, принятые системой по умолчанию, или адрес объекта содержит атрибуты. Объект, содержащий атрибуты, может быть связан с несколькими потоками. Аргумент attr содержит атрибуты, присваиваемые вновь создаваемому потоку. Значение аргумента может быть равно NULL, если новый поток должен использовать атрибуты, принятые системой по умолчанию, или адрес объекта содержит атрибуты. Объект, содержащий атрибуты, может быть связан с несколькими потоками. Функция pthread_attr_init создает объект, содержащий атрибуты, а функция phread_attr_destroy удаляет такой объект: #include <pthread.h> Int pthread_attr_init(pthread_attr_t* attr_p); Int pthread_attr_destroy(pthread_attr_t* attr_p);

Слайд 21





Атрибуты объекта, созданного функцией pthread_attr_init, можно проверить функцией pthread_attr_get, или установить функцией pthread_attr_set .
Атрибуты объекта, созданного функцией pthread_attr_init, можно проверить функцией pthread_attr_get, или установить функцией pthread_attr_set .
Например,  
состояние отсоединения 
     API для проверки  -  pthread_attr_getdetachstate
     API для установки -  pthread_attr_setdetachstate
правила планирования
	API для проверки  -  pthread_attr_getschedpolicy 
	API для установки – pthread_attr_setschedpolicy
Правила планирования задают, среди прочего, приоритет потока
Параметры планирования 
	API для проверки  -  pthread_attr_getschedparam 
	API для установки -  pthread_attr_setschedparam 
Второй аргумент в pthread_attr_getschedparam и pthread_attr_setschedparam – это адрес переменной типа struct  sched_param . В этой переменной есть целочисленное поле sched_priority,  в котором задается приоритет любогопотока, обладающего этим свойством.
Описание слайда:
Атрибуты объекта, созданного функцией pthread_attr_init, можно проверить функцией pthread_attr_get, или установить функцией pthread_attr_set . Атрибуты объекта, созданного функцией pthread_attr_init, можно проверить функцией pthread_attr_get, или установить функцией pthread_attr_set . Например, состояние отсоединения API для проверки - pthread_attr_getdetachstate API для установки - pthread_attr_setdetachstate правила планирования API для проверки - pthread_attr_getschedpolicy API для установки – pthread_attr_setschedpolicy Правила планирования задают, среди прочего, приоритет потока Параметры планирования API для проверки - pthread_attr_getschedparam API для установки - pthread_attr_setschedparam Второй аргумент в pthread_attr_getschedparam и pthread_attr_setschedparam – это адрес переменной типа struct sched_param . В этой переменной есть целочисленное поле sched_priority, в котором задается приоритет любогопотока, обладающего этим свойством.



Теги Fork
Похожие презентации
Mypresentation.ru
Загрузить презентацию