#include <pthread.h> #include <stdio.h> int p1[2]; void* char_print (void* parameter) { int fds; fds = *((int *)parameter); int i;

Relevanta dokument
HI1025 Operativsystem 7.0 hp, KTH Haninge, VT2017

(2) Skriv ett program som skapar ett antal processer vars relationer beskrivs av nedanstående tidsdiagram a

Grundprogrammen. combine

2... uppvisa förmåga att skapa och/eller hantera flerprocessiga program där de ingående processerna ges

Programmeringsteknik med C och Matlab

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011,

Tentamen i Introduktion till programmering

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Exempelsamling Assemblerprogrammering

Möte 9: Relationer mellan körande processer - (PI)

Att skriva till och läsa från terminalfönstret

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Rekursion och induktion för algoritmkonstruktion

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

Möte 10: Kommunikation mellan processer - (PI)

Övning från förra gången: readword

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Möte 7: Uppföljning av föreläsningen med Peer Instruction - (PI)

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Uppgift 1 (grundläggande konstruktioner)

Deluppgift 17 Processhantering: exec, sleep, exit, plist

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Föreläsning 8: Structar

Tentamen. Datorteknik och realtidssystem

Föreläsning 4. Val, boolska värden, läsbarhet, osv

Lösningsförslag till övningsuppgifter till föreläsning 6 Funktioner

HI1025 Operativsystem, KTH Haninge, VT2012

Tillfälle 14 (F): Fördjupat studium av parallellitet och synkronisering: processer, trådar, schemaläggning och signaler.

Code-Lite tutorial ( /RoJ)

OMTENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

Programmering, grundkurs, 8.0 hp HI1024, TEN1. Fredagen den 2 mars 2012

Tung bakgrundsaktivitet t.ex. Aktiva objekt t.ex. Animering, simulering. DD2385 Programutvecklingsteknik Några bilder till föreläsning 9 6/5 2013

Om pekare och minneshantering i C, relaterat till operativsystem och särskilt konstruktionen fork() execvp().

PROGRAMMERING-Java Omtentamina

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Tentamen: Datordel Programmeringsteknik

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Uppgifter till praktiska tentan, del A. (7 / 27)

Tentamen EDAF30 Programmering i C++

read Systemanrop i UNIX Exempel med read & write write int antal_tkn, fd, count; char buffer[size]; antal_tkn = read(fd, buffer, count);

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

... Funktionsanrop. Vad händer när man kör ett program?

Planering Programmering grundkurs HI1024 HT TIDAA

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Fö 4 TSEA81. Monitors and Message passing. Condition variables - händelsevariabler

Laboration: Whitebox- och blackboxtesting

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Övningsuppgifter till föreläsning 2 Variabler och uttryck

Tentamen Datorteknik och realtidssystem, TSEA81 Datum Lokal

Datorlaboration 0, Programmering i C++ (EDAF30)

Föreläsning 5-6 Innehåll

Klassdeklaration. Metoddeklaration. Parameteröverföring

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Datorlaboration 0, Programmering i C++ (EDA623)

Föreläsning 3-4 Innehåll

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

HI1024 Programmering, grundkurs TEN

Obligatorisk uppgift: Simulering av köer i ett trafiksystem

Scratch Junior. makeandshape.com. by MIT. Gränssnitt Scratch Junior

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Fö 4 TSEA81. Monitors and Message passing

Föreläsning 10. Pekare (Pointers)

Realtidsstöd i Minix. En laborationrapport. Oktober 2012

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Föreläsning 6 pekare och pekare tillsammans med arrayer

Arrays (indicerade variabler) Föreläsning 6

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Smart Rogic Manual. Robostick Manual

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Operativsystem (ID2200/06) XX XX:00-XX:00

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

*Pekarvärden *Pekarvariabler & *

Planering Programmering grundkurs HI1024 HT data

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Concurrency Saker händer samtidigt. Process En instans av ett program

TDIU01 Programmering i C++

Lösningar till uppgifterna sätts ut på kurssidan och på WebCT (Gamla Tentor) i dag kl 19. Tentamen i Programmering C, 5p, Distans, övriga,

Dugga i Grundläggande programmering STS, åk

Planering Programmering grundkurs HI1024 HT 2014

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Minnestilldelning (allokering) och frigörande (avallokering) av minne

Objektorienterad programmering D2

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk:

Iteration while-satsen

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Tentamen i Programmering

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN1 - Teoretisk tentamen Tid: Torsdagen den 20 oktober 2011,

Transkript:

Övningar på trådar Det kommer att visa sig att det är mycket enklare att programmera med trådsom pratar med pipes/sockets ar när man en gång bemästrat IPC med processer och pipes/sockets. Vi ska dock formulera några övningsuppgifter som illustrerar detta. Vi kommer att utgå från följande grundläggande program som skapar två trådar och som fungerar med parametrar: /* Parameters to print_function. */ struct char_print_parms /* The character to print. */ /* The number of times to print it. */ int count; ; /* Prints a number of characters to stderr, as given by PARAMETERS, which is a pointer to a struct char_print_parms. */ void* char_print (void* parameters) /* Cast the cookie pointer to the right type. */ struct char_print_parms* p = (struct char_print_parms*) parameters; int i; for (i = 0; i < p->count; ++i) fputc (p->character, stderr); pthread_t thread2_id; struct char_print_parms thread1_args; struct char_print_parms thread2_args; /* Create a new thread to print 30000 x s. */ thread1_args.character = x ; thread1_args.count = 30000; pthread_create (&thread1_id, NULL, &char_print, &thread1_args); /* Create a new thread to print 20000 o s. */ thread2_args.character = o ; thread2_args.count = 20000; pthread_create (&thread2_id, NULL, &char_print, &thread2_args); /* Make sure the first thread has finished. */ pthread_join (thread1_id, NULL); /* Make sure the second thread has finished. */ pthread_join (thread2_id, NULL); /* Now we can safely return. */ Vi studerade detta program när vi först började med trådar, det skapar två trådar som vardera skriver ut på skärmen varsinn symbol. Vi ska modifiera detta program så att trådarna kan styras mer av huvudprogrammet 1

2 och vi ska styra trådarna med pipar istället. Övningen kommer att illustrera hur trådarna finns i samma adressrymd och därmed bara kan använda piparna direkt utan att stänga oanvända läs- eller skrivändar och liknande. Övning 1. Skriv om ovanstående program så att endast en tråd startas och istället för att skicka styrparametrar via structen, skicka tre saker via en pipe: 1. Tecken att skriva ut. 2. Antal tecken att skriva ut. 3. En antal sekunder som tråden ska pausa innan den börjar skriva ut. Låt även tråden skriva ut ett tecken i sekunden istället för att bara vräka ut tecken. (Det blir lite mer överskådligt då. Lösning. Lösningen illustreras i 4 steg som benämns ass1 stage1.c, ass1 stage2.c, ass1 stage3.c respektive ass1 stage4.c. I första stadiet skrivs bara ett program som skickar in en fildeskriptor i en tråd, det enda tråden gör är att skriva ut fildeskriptorn som blir 3 (= läsänden på en pipe som skapas av huvudtråden). Det ser ut så här: int i; printf("fds: %d.\n", fds); * The main program. */ /* Make sure the first thread has finished. */ pthread_join (thread1_id, NULL); Observera att tråden bara behöver fildeskriptorn, som ju är ett vanligt heltal. Vid systemanropet pipe(p1) så skapas pipen och inga ändar behöver alltså stängas efter det anropet som vi normalt behöver göra då parallella processer skapas. Här kan vi alltå bara använda deskriptorn direkt. En testkörning resulterar i att talet 3 skrivs ut. Vi gå vidare till stage2 där programmet utvidgats lite till att vi skickar något över pipen, vi läser in ett testtal, programmet ser ut så haär: int i, x; read(fds, &x, sizeof(int)); printf("got: %d.\n", x);

3 int x = 47; write(p1[1], &x, sizeof(int)); Detta program skriver ut Got: 47, vilket indikerar att talet 47 skickats från huvudprogrammet till tråden. Stadium 3 (stage3) innebär att vi skickar mycket mer information via pipen, vi skickar, tecken, antal gången som det ska skrivas ut och antal sekunder som tråden ska ska sova innan utskrifterna påbörjas. Det ser ut så här: int count; int pause; read(fds, &character, sizeof(char)); printf("got: %c, %d, %d.\", character, count, pause); //for (i = 0; i < p->count; ++i) // fputc (p->character, stderr); int count, pause; printf("tecken: "); scanf("%c", &character); printf("antal: "); scanf("%d", &count);

4 testkörningen bestå i att användaren matar in de tre uppgifterna och sedan skriver tråden ut att dessa kommit in. Detta program utvidgas sedan lätt till slutresultatet: int i, fds; fds = *((int *)parameter); int count; int pause; while(read(fds, &character, sizeof(char))) sleep(pause); for (i = 0; i < count; ++i) sleep(1); fputc (character, stderr); int count, pause; printf("tecken: "); scanf("%c", &character); printf("antal: "); scanf("%d", &count); Denna trådläser från pipen men har en möjlighet att uppfatta att pipen stängs, vi kommer att använda det i senare versioner. Övning 2. Utvidga programmet ovan så att två trådar startar och skriver ut två tecken samtidigt. Du måste då synkronisera användningen av pipen så att inte båda trådarna läser från den på en gång. Det är ok att gå över till att ange asciikoder för tecken så slipper vi problem med inmatning av text/siffror. Lösning.

5 pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; int i, fds; fds = *((int *)parameter); int character; int count; int pause; while(1) pthread_mutex_lock(&m); if(!count)break; read(fds, &character, sizeof(int)); pthread_mutex_unlock(&m); sleep(pause); for (i = 0; i < count; ++i) sleep(1); fputc (character, stderr); pthread_mutex_unlock(&m); int count, pause; pthread_t thread2_id; pthread_create (&thread2_id, NULL, &char_print, &(p1[0])); printf("antal (0 fr att avsluta): "); scanf("%d", &count); printf("tecken: "); scanf("%d", &character); printf("antal (0 fr att avsluta): "); scanf("%d", &count); printf("tecken: "); scanf("%d", &character); count=0; write(p1[1],&count,sizeof(int)); write(p1[1],&count,sizeof(int)); printf("\n\n"); pthread_join(thread2_id, NULL);