Поточно предаване на данни
символ на знака;/* Символът за отпечатване * /
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? Обяснете резултатите.