Stwórz program w wybranym przez siebie języku programowania, w którym co najmniej jeden wątek będzie generował informację i co najmniej jeden wątek będzie tę informację przetwarzał. Komunikacja wątków powinna być zsynchronizowana.
Przykładowe działanie takiego programu: jeden wątek losuje liczbę i wypisuje na wyjściu standardowym, jaka liczba została przez niego wygenerowana, a następnie drugi wątek również wypisuje ją na wyjściu standardowym.
Przykładowym wynikiem takiego programu może być np.:
Linia 1. Producent wygenerowal liczbe dwukropek 41.
Linia 2. Konsument numer dwukropek 1 skonsumowal dwukropek 41.
Linia 3. Producent wygenerowal liczbe dwukropek 67.
Linia 4. Konsument numer dwukropek 0 skonsumowal dwukropek 67.
Linia 5. Producent wygenerowal liczbe dwukropek 34.
Linia 6. Konsument numer dwukropek 4 skonsumowal dwukropek 34.
Linia 7. kropka kropka kropka kropka.
Ważne!
Podczas sprawdzania poprawności wykonanego zadania zwróć uwagę na to, czy generowana przez producenta liczba jest identyczna z liczbą skonsumowaną przez konsumenta! Jeżeli tak jest, to znaczy, że rozwiązanie wypisuje poprawne wyniki.
Rozwiązanie w C++
Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny.
Linia 2. kratka include otwórz nawias ostrokątny thread zamknij nawias ostrokątny.
Linia 3. kratka include otwórz nawias ostrokątny mutex zamknij nawias ostrokątny.
Linia 4. kratka include otwórz nawias ostrokątny windows kropka h zamknij nawias ostrokątny.
Linia 6. using namespace std średnik.
Linia 7. mutex zamek średnik.
Linia 9. int wygenerowanaLiczba znak równości minus 1 średnik.
Linia 10. void producent otwórz nawias okrągły zamknij nawias okrągły.
Linia 11. otwórz nawias klamrowy.
Linia 12. while otwórz nawias okrągły true zamknij nawias okrągły.
Linia 13. otwórz nawias klamrowy.
Linia 14. zamek kropka lock otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 15. if otwórz nawias okrągły wygenerowanaLiczba znak równości znak równości minus 1 zamknij nawias okrągły.
Linia 16. otwórz nawias klamrowy.
Linia 17. wygenerowanaLiczba znak równości rand otwórz nawias okrągły zamknij nawias okrągły procent 100 średnik.
Linia 18. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Producent wygenerowal liczbe dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny wygenerowanaLiczba otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 19. zamknij nawias klamrowy.
Linia 20. zamek kropka unlock otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 21. zamknij nawias klamrowy.
Linia 22. zamknij nawias klamrowy.
Linia 24. void konsument otwórz nawias okrągły int n zamknij nawias okrągły.
Linia 25. otwórz nawias klamrowy.
Linia 26. while otwórz nawias okrągły true zamknij nawias okrągły.
Linia 27. otwórz nawias klamrowy.
Linia 28. Sleep otwórz nawias okrągły 1000 zamknij nawias okrągły średnik.
Linia 29. zamek kropka lock otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 30. if otwórz nawias okrągły wygenerowanaLiczba wykrzyknik znak równości minus 1 zamknij nawias okrągły.
Linia 31. otwórz nawias klamrowy.
Linia 32. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Konsument numer dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny n otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów skonsumowal dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny wygenerowanaLiczba otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 33. wygenerowanaLiczba znak równości minus 1 średnik.
Linia 34. zamknij nawias klamrowy.
Linia 35. zamek kropka unlock otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 36. zamknij nawias klamrowy.
Linia 37. zamknij nawias klamrowy.
Linia 39. int main otwórz nawias okrągły zamknij nawias okrągły.
Linia 40. otwórz nawias klamrowy.
Linia 41. srand otwórz nawias okrągły time otwórz nawias okrągły NULL zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 42. thread thProducent znak równości thread otwórz nawias okrągły producent zamknij nawias okrągły średnik.
Linia 43. thread thKonsument otwórz nawias kwadratowy 5 zamknij nawias kwadratowy średnik.
Linia 44. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny 5 średnik i plus plus zamknij nawias okrągły.
Linia 45. thKonsument otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości thread otwórz nawias okrągły konsument przecinek i zamknij nawias okrągły średnik.
Linia 46. thProducent kropka join otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 47. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny 5 średnik i plus plus zamknij nawias okrągły.
Linia 48. thKonsument otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka join otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 50. zamknij nawias klamrowy.
Rozwiązanie w Javie
Rozwiązanie w Javie
Linia 1. import java kropka util kropka Random średnik.
Linia 2. import java kropka util kropka concurrent kropka Semaphore średnik.
Linia 4. public class Main otwórz nawias klamrowy.
Linia 5. static int wygenerowanaLiczba znak równości minus 1 średnik.
Linia 6. static Semaphore zamekProducenta znak równości new Semaphore otwórz nawias okrągły 1 zamknij nawias okrągły średnik.
Linia 7. static Semaphore zamekKonsumenta znak równości new Semaphore otwórz nawias okrągły 0 zamknij nawias okrągły średnik.
Linia 8. static Random rd znak równości new Random otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 10. public static class Producent implements Runnable otwórz nawias klamrowy.
Linia 11. at Override.
Linia 12. public void run otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 13. while otwórz nawias okrągły true zamknij nawias okrągły otwórz nawias klamrowy.
Linia 14. try otwórz nawias klamrowy.
Linia 15. zamekProducenta kropka acquire otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 16. wygenerowanaLiczba znak równości rd kropka nextInt otwórz nawias okrągły 100 zamknij nawias okrągły średnik.
Linia 17. System kropka out kropka println otwórz nawias okrągły cudzysłów Producent wygenerowal liczbe dwukropek cudzysłów plus wygenerowanaLiczba zamknij nawias okrągły średnik.
Linia 18. zamekKonsumenta kropka release otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 19. zamknij nawias klamrowy catch otwórz nawias okrągły InterruptedException e zamknij nawias okrągły otwórz nawias klamrowy.
Linia 20. e kropka printStackTrace otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 21. zamknij nawias klamrowy.
Linia 22. zamknij nawias klamrowy.
Linia 23. zamknij nawias klamrowy.
Linia 24. zamknij nawias klamrowy.
Linia 26. public static class Konsument implements Runnable otwórz nawias klamrowy.
Linia 27. int numerKonsumenta średnik.
Linia 29. Konsument otwórz nawias okrągły int numerKonsumenta zamknij nawias okrągły otwórz nawias klamrowy.
Linia 30. this kropka numerKonsumenta znak równości numerKonsumenta średnik.
Linia 31. zamknij nawias klamrowy.
Linia 33. at Override.
Linia 34. public void run otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 35. while otwórz nawias okrągły true zamknij nawias okrągły otwórz nawias klamrowy.
Linia 36. try otwórz nawias klamrowy.
Linia 37. zamekKonsumenta kropka acquire otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 38. System kropka out kropka println otwórz nawias okrągły cudzysłów Konsument numer dwukropek cudzysłów plus numerKonsumenta plus cudzysłów przecinek skonsumowal dwukropek cudzysłów plus wygenerowanaLiczba zamknij nawias okrągły średnik.
Linia 39. zamekProducenta kropka release otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 40. zamknij nawias klamrowy catch otwórz nawias okrągły InterruptedException e zamknij nawias okrągły otwórz nawias klamrowy.
Linia 41. e kropka printStackTrace otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 42. zamknij nawias klamrowy.
Linia 43. zamknij nawias klamrowy.
Linia 44. zamknij nawias klamrowy.
Linia 45. zamknij nawias klamrowy.
Linia 47. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy.
Linia 48. Thread otwórz nawias kwadratowy zamknij nawias kwadratowy konsumenci znak równości new Thread otwórz nawias kwadratowy 5 zamknij nawias kwadratowy średnik.
Linia 49. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny 5 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 50. konsumenci otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości new Thread otwórz nawias okrągły new Konsument otwórz nawias okrągły i zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 51. zamknij nawias klamrowy.
Linia 52. Thread producent znak równości new Thread otwórz nawias okrągły new Producent otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 53. producent kropka start otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 54. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny 5 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 55. konsumenci otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka start otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 56. zamknij nawias klamrowy.
Linia 57. zamknij nawias klamrowy.
Linia 58. zamknij nawias klamrowy.
Rozwiązanie w Pythonie
Linia 1. import threading.
Linia 2. import random.
Linia 4. wygenerowanaLiczba znak równości minus 1.
Linia 5. zamekProducenta znak równości threading kropka Lock otwórz nawias okrągły zamknij nawias okrągły.
Linia 6. zamekKonsumenta znak równości threading kropka Lock otwórz nawias okrągły zamknij nawias okrągły.
Linia 7. zamekKonsumenta kropka acquire otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 8. def producent otwórz nawias okrągły zamknij nawias okrągły dwukropek.
Linia 9. while otwórz nawias okrągły 1 zamknij nawias okrągły dwukropek.
Linia 10. zamekProducenta kropka acquire otwórz nawias okrągły zamknij nawias okrągły.
Linia 11. global wygenerowanaLiczba.
Linia 12. wygenerowanaLiczba znak równości random kropka randint otwórz nawias okrągły 0 przecinek 10 zamknij nawias okrągły.
Linia 13. print otwórz nawias okrągły cudzysłów Producent wygenerowal dwukropek cudzysłów przecinek wygenerowanaLiczba zamknij nawias okrągły średnik.
Linia 14. zamekKonsumenta kropka release otwórz nawias okrągły zamknij nawias okrągły.
Linia 15. def konsument otwórz nawias okrągły a zamknij nawias okrągły dwukropek.
Linia 16. while otwórz nawias okrągły 1 zamknij nawias okrągły dwukropek.
Linia 17. global wygenerowanaLiczba.
Linia 18. zamekKonsumenta kropka acquire otwórz nawias okrągły zamknij nawias okrągły.
Linia 19. print otwórz nawias okrągły cudzysłów Konsument dwukropek cudzysłów przecinek a przecinek cudzysłów skonsumowal dwukropek cudzysłów przecinek wygenerowanaLiczba zamknij nawias okrągły.
Linia 20. wygenerowanaLiczba znak równości minus 1.
Linia 21. zamekProducenta kropka release otwórz nawias okrągły zamknij nawias okrągły.
Linia 22. konsumenci znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy.
Linia 23. producenci znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy.
Linia 24. for i in range otwórz nawias okrągły 5 zamknij nawias okrągły dwukropek.
Linia 25. t znak równości threading kropka Thread otwórz nawias okrągły target znak równości producent zamknij nawias okrągły.
Linia 26. producenci kropka append otwórz nawias okrągły t zamknij nawias okrągły.
Linia 27. t znak równości threading kropka Thread otwórz nawias okrągły target znak równości konsument przecinek args znak równości otwórz nawias okrągły i przecinek zamknij nawias okrągły zamknij nawias okrągły.
Linia 28. konsumenci kropka append otwórz nawias okrągły t zamknij nawias okrągły.
Linia 29. for i in range otwórz nawias okrągły 5 zamknij nawias okrągły dwukropek.
Linia 30. producenci otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka start otwórz nawias okrągły zamknij nawias okrągły.
Linia 31. konsumenci otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka start otwórz nawias okrągły zamknij nawias okrągły.
Linia 32. for i in range otwórz nawias okrągły 5 zamknij nawias okrągły dwukropek.
Linia 33. konsumenci otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka join otwórz nawias okrągły zamknij nawias okrągły.
Linia 34. producenci otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka join otwórz nawias okrągły zamknij nawias okrągły.
Dla zainteresowanych
Zadanie z ćwiczenia pierwszego zrealizuj w ten sposób, żeby wątek producenta generował kolejne wyrazy ciągu Fibbonaciego, a wątek konsumenta je wypisywał.
R14BSv8JI0ja71
Ćwiczenie 2
R10Xw7Oyg7iA22
Ćwiczenie 3
R14Zpa8usRSiZ2
Ćwiczenie 4
RwV9o8r1nFTkN2
Ćwiczenie 5
3
Ćwiczenie 6
Zapoznaj się z kodem i wykonaj ćwiczenie.
Linia 1. a dwukropek znak równości 5.
Linia 2. b dwukropek znak równości 2.
Linia 3. c dwukropek znak równości a asterysk b.
Linia 4. c dwukropek znak równości c asterysk b.
Linia 5. wypisz c.