Поточно предаване на данни

символ на знака;/* Символът за отпечатване * /

int count;/* Колко пъти да се отпечатва знак * /

void * char_print (void * параметри)

/ * Преобразувайте показалеца в желания тип * /

struct char_print_parms * p = (struct char_print_parms *) параметри;

за (i = 0; i броя; ++ i)

fputc (p-> символ, stderr);

struct char_print_parms thread1_args;

struct char_print_parms thread2_args;

thread1_args.count = 30;/* Отпечатайте 'x' 30 пъти * /

thread2_args.count = 20;/* Отпечатайте 'o' 20 пъти * /

Внимание! Тази програма съдържа грешка. За да отстраните грешки в програмата, добавете отпечатък на предадените параметри към функцията поток. Коригирайте грешката и обяснете причината.

Комбиниране на потоци

В случай на потоци, аналогът на функцията изчакайте е функцията pthread_join: нишката, която извика тази функция, ще изчака да завърши посочената нишка. Функцията връща нула при нормално изпълнение и ненулева при грешка. Функцията има два параметъра: ID на нишката, която трябва да изчака, и променлива от тип указател към нищожен, където стойността, върната от потока, ще бъде записана. Ако тази стойност не се изисква, тогава вторият параметър на функцията pthread_join може да е NULL.

Задание 3. Създайте програма pr3.c, модифициране на програмата pr2.c: а) добавете извикване на функция към основната нишка pthread_join да изчакате и двете дъщерни нишки да завършат; б) върнете някои стойности от дъщерните нишки (различни!) и ги отпечатайте върху основната нишка.

II. Сравнение на нишки и процеси

Научете как работят четирите програми, makefile, просто.в, прости_процеси.в, simple_threads.c, simple_mutex.c, дадени в Приложението (Текстове на програми и makefile съдържащи се във файла приложение.doc):

Редовна програма просто.в, състоящ се от функцията основен и две допълнителни функции; не използва многозадачност или многопоточност.

Програма прости_процеси.в стартира три процеса - родител и две деца.

Програма simple_threads.c стартира три нишки - основната (основната) и две дъщерни.

Програма simple_mutex.c с три нишки, както в (в) и използване на мютекс за синхронизация.

Програмите (а), (б) и (в) извършват едни и същи изчисления.

4.1. Копиране на файлове makefile, просто.в, прости_процеси.в, simple_threads.c, simple_mutex.c към вашата директория. За да създадете изпълними файлове за всичките четири програми, стартирайте помощната програма направи няма параметри.

4.2. Стартирайте изпълними файлове просто, прости_процеси и прости_нишки. Обяснете получените резултати.

4.3. Опитайте се да изчислите времето за изпълнение на програмите просто, прости_процеси и прости_нишки. Това може да стане по един от двата начина:

Използвайте във функция основен и трите програми се отличават gettimeofday (не забравяйте да включите). Тази функция трябва да бъде включена на две места в програмата: преди и след извикване на две функции в просто; преди и след създаване и стартиране на два процеса/нишки в прости_процеси/прости_нишки. За по-точен резултат изключете printf от функции do_one_thing и do_another_thing.

Използвайте обикновен часовник. За да може програмата да работи няколко минути, включете основен всяка програма е цикъл, повтарящ се поне 32 000 пъти. За по-точен резултат изключете printf от функции do_one_thing и do_another_thing.

Обяснете часовата разлика между трите програми.

4.4. Стартирайте програмата simple_mutex. Проверете дали променливата често срещани (променя се паралелно с две нишки), променя стойността си от 0 до 100 (тъй като всяка нишка променя тази променлива точно 50 пъти). Имайте предвид, че във всеки момент от време променливата често срещани четене, се увеличава с 1 и тогава написана без прекъсване само от една нишка. Това се осигурява от mutex механизма, който се използва и от двете нишки (вижте функциите pthread_mutex_lock и pthread_mutex_unlock).

4.5. След това премахнете mutex механизма от програмата simple_mutex_c, прекомпилирайте го и го стартирайте няколко пъти. Еднакви ли са стойностите често срещани при различни стартирания? Винаги е променлива често срещани има крайна стойност 100? Обяснете резултатите.