<<
>>

Прогон программы с использованием двух нитей исполнения

Для иллюстрации вышесказанного давайте рассмотрим программу, в которой работают две нити исполнения:

/* Программа 06-2.с для иллюстрации работы двух нитей исполнения. Каждая нить исполнения просто увеличивает на 1 разделяемую переменную а.

*/

#include

#include int a = 0 ;

/* Переменная а является глобальной статической для всей программы, поэтому она будет разделяться обеими нитями исполнения.*/

/* Ниже следует текст функции, которая будет ассоциирована со 2-м thread'ом */ void *mythread(void *dummy)

/* Параметр dummy в нашей функции не используется и присутствует только для совместимости типов данных.

По той же причине функция возвращает значение void *, хотя это никак не используется в программе.*/

{

pthread_t mythid; /* Для идентификатора нити исполнения */

/* Заметим, что переменная mythid является динамической локальной переменной функции mythread(), т. е. помещается в стеке и, следовательно, не разделяется нитями исполнения. */ /* Запрашиваем идентификатор thread'а */ mythid = pthread_self(); а = а +1 ;

printf(“Thread %d, Calculation result = %d\n”, mythid, a); return NULL;

}

/* Функция main() - она же ассоциированная функция главного thread'а */ int main()

{

pthread_t thid, mythid; int result;

/* Пытаемся создать новую нить исполнения, ассоциированную с функцией mythread(). Передаем ей в качестве параметра значение NULL. В случае удачи в переменную thid занесется идентификатор нового thread'а. Если возникнет ошибка, то прекратим работу. */

result = pthread_create( &thid,

(pthread_attr_t *)NULL, mythread, NULL); if(result != 0){

printf ("Error on thread create, return value = %d\n", result); exit(-1);

}

printf("Thread created, thid = %d\n", thid);

/* Запрашиваем идентификатор главного thread'a */ mythid = pthread_self(); a = a+1;

printf("Thread %d, Calculation result = %d\n", mythid, a);

/* Ожидаем завершения порожденного thread'a, не интересуясь, какое значение он нам вернет. Если не выполнить вызов этой функции, то возможна ситуация, когда мы завершим функцию main() до того, как выполнится порожденный thread, что автоматически повлечет за собой его завершение, исказив результаты. */

pthread_join(thid, (void **)NULL); return 0;

}

Для сборки исполняемого файла при работе редактора связей необходимо явно подключить библиотеку функций для работы с pthread'aMH,

которая не подключается автоматически. Это делается с помощью добавления к команде компиляции и редактирования связей параметра -lpthread — подключить библиотеку pthread. Наберите текст, откомпилируйте эту программу и запустите на исполнение.

Обратите внимание на отличие результатов этой программы от похожей программы, иллюстрировавшей создание нового процесса (раздел «Прогон программы с fork () с одинаковой работой родителя и ребенка»), которую мы рассматривали на семинарах 3 — 4. Программа, создававшая новый процесс, печатала дважды одинаковые значения для переменной а, так как адресные пространства различных процессов независимы, и каждый процесс прибавлял 1 к своей собственной переменной а. Рассматриваемая программа печатает два разных значения, так как переменная а является разделяемой, и каждый thread прибавляет 1 к одной и той же переменной.

<< | >>
Источник: В.Е. Карпов К.А. Коньков. Основы операционных систем. 2005 {original}

Еще по теме Прогон программы с использованием двух нитей исполнения:

  1. Статья 455. Использование передачи (программы) организации вещания
  2. 3. Использование программ для ЭВМ, баз данных и топологий ИМС третьими лицами
  3. Статья 453. Использование исполнения
  4. 3. Исполнение расчетных обязательств с использованием банковских карт
  5. Глава 37 - Гражданского кодекса Право интеллектуальной собственности на исполнение, фонограмму, видеограмму и программу (передачу), организацию вещания (сопредельные права)
  6. § 19 Уклонение от исполнения. – Право отказываться от исполне- ния за неисправностью другой стороны. – Невозможность исполнения вследствие внешних обстоятельств. – Взаимный отказ от исполнения.
  7. Раздел III Использование достижений криминалистической психологии при собирании, оценке, использовании личностной информации
  8. Свободное воспроизведение программ для ЭВМ и баз данных. Декомпилирование программ для ЭВМ
  9. Программа Да и программа Нет
  10. 1. О двух путях развития
  11. Закон двух колес
  12. Закон двух колес
  13. Ссора двух подруг
  14. Метаязык двух слов.
  15. Книга состоит из двух частей.
  16. Земля после Затопления двух Континентов
  17. Статья 231. Незаконный сбор с целью использования или использование сведений, составляющих коммерческую или банковскую тайну
  18. НЛП целиком построено на двух фундаментальных принципах:
  19. Анкета - это диалог двух заинтересованных людей
  20. Скрытый кризис: от тридцати пяти до сорока двух