<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sr">
	<id>https://siwiki.rs/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9E%D0%A11%2F%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025</id>
	<title>ОС1/Модификације октобар 2025 - Историја измена</title>
	<link rel="self" type="application/atom+xml" href="https://siwiki.rs/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9E%D0%A11%2F%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025"/>
	<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025&amp;action=history"/>
	<updated>2026-06-04T06:22:00Z</updated>
	<subtitle>Историја измена ове странице на пројекту</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025&amp;diff=8323&amp;oldid=prev</id>
		<title>Bambula: /* Modifikacija: joinAll */</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025&amp;diff=8323&amp;oldid=prev"/>
		<updated>2026-03-10T14:03:04Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Modifikacija: joinAll&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;sr&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Старија измена&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Верзија на датум 10. март 2026. у 16:03&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Ред 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ред 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Modifikacija: joinAll ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Modifikacija: joinAll &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(30p) &lt;/ins&gt;==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Doodati sistemske pozive &amp;lt;code&amp;gt;thread_add_child&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;thread_join_all&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Doodati sistemske pozive &amp;lt;code&amp;gt;thread_add_child&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;thread_join_all&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Bambula</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025&amp;diff=8321&amp;oldid=prev</id>
		<title>Bambula: /* Modifikacija: joinAll */</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025&amp;diff=8321&amp;oldid=prev"/>
		<updated>2026-03-09T16:39:00Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Modifikacija: joinAll&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;sr&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Старија измена&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Верзија на датум 9. март 2026. у 18:39&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Ред 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ред 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Modifikacija: joinAll ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Modifikacija: joinAll ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Dodati &lt;/del&gt;sistemske pozive &amp;lt;code&amp;gt;thread_add_child&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;thread_join_all&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Doodati &lt;/ins&gt;sistemske pozive &amp;lt;code&amp;gt;thread_add_child&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;thread_join_all&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;code&amp;gt;thread_add_child&amp;lt;/code&amp;gt; registruje dete-nit za tekuću (pozivajuću) nit.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;code&amp;gt;thread_add_child&amp;lt;/code&amp;gt; registruje dete-nit za tekuću (pozivajuću) nit.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;code&amp;gt;thread_join_all&amp;lt;/code&amp;gt; blokira tekuću nit dok se sva njena deca ne izvrše.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;code&amp;gt;thread_join_all&amp;lt;/code&amp;gt; blokira tekuću nit dok se sva njena deca ne izvrše.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Bambula</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025&amp;diff=8320&amp;oldid=prev</id>
		<title>Bambula у 16:32, 9. март 2026.</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025&amp;diff=8320&amp;oldid=prev"/>
		<updated>2026-03-09T16:32:10Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025&amp;amp;diff=8320&amp;amp;oldid=8319&quot;&gt;Прикажи измене&lt;/a&gt;</summary>
		<author><name>Bambula</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025&amp;diff=8319&amp;oldid=prev</id>
		<title>Bambula: Уклоњена целокупна садржина странице</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025&amp;diff=8319&amp;oldid=prev"/>
		<updated>2026-03-09T16:31:02Z</updated>

		<summary type="html">&lt;p&gt;Уклоњена целокупна садржина странице&lt;/p&gt;
&lt;a href=&quot;https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025&amp;amp;diff=8319&amp;amp;oldid=8318&quot;&gt;Прикажи измене&lt;/a&gt;</summary>
		<author><name>Bambula</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025&amp;diff=8318&amp;oldid=prev</id>
		<title>Bambula: Нова страница: == Modifikacija: joinAll ==  Dodati sistemske pozive &lt;code&gt;thread_add_child&lt;/code&gt; i &lt;code&gt;thread_join_all&lt;/code&gt;. &lt;code&gt;thread_add_child&lt;/code&gt; registruje dete-nit za tekuću (pozivajuću) nit. &lt;code&gt;thread_join_all&lt;/code&gt; blokira tekuću nit dok se sva njena deca ne izvrše. U okviru C++ API dodati nestatičke metode &lt;code&gt;addChild(Thread* child)&lt;/code&gt; i &lt;code&gt;joinAll()&lt;/code&gt; u klasu &lt;code&gt;Thread&lt;/code&gt;. Napisati test program: nit A pravi 3×B i 1×C, svaki B…</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%98%D0%B5_%D0%BE%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80_2025&amp;diff=8318&amp;oldid=prev"/>
		<updated>2026-03-09T16:24:24Z</updated>

		<summary type="html">&lt;p&gt;Нова страница: == Modifikacija: joinAll ==  Dodati sistemske pozive &amp;lt;code&amp;gt;thread_add_child&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;thread_join_all&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;thread_add_child&amp;lt;/code&amp;gt; registruje dete-nit za tekuću (pozivajuću) nit. &amp;lt;code&amp;gt;thread_join_all&amp;lt;/code&amp;gt; blokira tekuću nit dok se sva njena deca ne izvrše. U okviru C++ API dodati nestatičke metode &amp;lt;code&amp;gt;addChild(Thread* child)&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;joinAll()&amp;lt;/code&amp;gt; u klasu &amp;lt;code&amp;gt;Thread&amp;lt;/code&amp;gt;. Napisati test program: nit A pravi 3×B i 1×C, svaki B…&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Нова страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Modifikacija: joinAll ==&lt;br /&gt;
&lt;br /&gt;
Dodati sistemske pozive &amp;lt;code&amp;gt;thread_add_child&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;thread_join_all&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;thread_add_child&amp;lt;/code&amp;gt; registruje dete-nit za tekuću (pozivajuću) nit.&lt;br /&gt;
&amp;lt;code&amp;gt;thread_join_all&amp;lt;/code&amp;gt; blokira tekuću nit dok se sva njena deca ne izvrše.&lt;br /&gt;
U okviru C++ API dodati nestatičke metode &amp;lt;code&amp;gt;addChild(Thread* child)&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;joinAll()&amp;lt;/code&amp;gt; u klasu &amp;lt;code&amp;gt;Thread&amp;lt;/code&amp;gt;.&lt;br /&gt;
Napisati test program: nit A pravi 3×B i 1×C, svaki B pravi 3×C. Roditelj čeka svu svoju decu pre nego što nastavi.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
==== TCB.hpp ====&lt;br /&gt;
Dodato na vrhu fajla (forward declaration):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class Semaphore;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nova polja u &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt; sekciji:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
TCB* parent;            // pokazivač na roditelja (nullptr ako nema)&lt;br /&gt;
int childCount;         // broj nezavršene dece&lt;br /&gt;
Semaphore* childrenSem; // semafor na koji roditelj čeka u joinAll&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nove metode u &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; sekciji:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void addChild(TCB* parent, TCB* child);&lt;br /&gt;
static void joinAllChildren();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== TCB.cpp ====&lt;br /&gt;
Dodat include na vrhu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;../h/Semaphore.hpp&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
U konstruktoru, inicijalizacija novih polja (posle &amp;lt;code&amp;gt;this-&amp;gt;finished = false;&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
this-&amp;gt;parent = nullptr;&lt;br /&gt;
this-&amp;gt;childCount = 0;&lt;br /&gt;
this-&amp;gt;childrenSem = nullptr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Izmenjen &amp;lt;code&amp;gt;dispatch()&amp;lt;/code&amp;gt; — else grana proširena da obavesti roditelja kad dete završi:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void TCB::dispatch() {&lt;br /&gt;
    TCB *old = running;&lt;br /&gt;
    if (!old-&amp;gt;isFinished()) {&lt;br /&gt;
        Scheduler::put(old);&lt;br /&gt;
    } else {&lt;br /&gt;
        if (old-&amp;gt;parent != nullptr) {&lt;br /&gt;
            old-&amp;gt;parent-&amp;gt;childCount--;&lt;br /&gt;
            if (old-&amp;gt;parent-&amp;gt;childCount == 0 &amp;amp;&amp;amp; old-&amp;gt;parent-&amp;gt;childrenSem != nullptr) {&lt;br /&gt;
                old-&amp;gt;parent-&amp;gt;childrenSem-&amp;gt;sem_signal();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    running = Scheduler::get();&lt;br /&gt;
    contextSwitch(&amp;amp;old-&amp;gt;context, &amp;amp;running-&amp;gt;context);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nove funkcije:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void TCB::addChild(TCB* parent, TCB* child) {&lt;br /&gt;
    child-&amp;gt;parent = parent;&lt;br /&gt;
    parent-&amp;gt;childCount++;&lt;br /&gt;
    if (parent-&amp;gt;childrenSem == nullptr) {&lt;br /&gt;
        Semaphore::createSemaphore(&amp;amp;parent-&amp;gt;childrenSem, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TCB::joinAllChildren() {&lt;br /&gt;
    if (running-&amp;gt;childCount &amp;lt;= 0) return;&lt;br /&gt;
    running-&amp;gt;childrenSem-&amp;gt;sem_wait();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syscall_c.hpp ====&lt;br /&gt;
Dodate deklaracije:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void thread_add_child(thread_t child);&lt;br /&gt;
void thread_join_all();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syscall_c.cpp ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void thread_add_child(thread_t child) {&lt;br /&gt;
    if (child == nullptr) return;&lt;br /&gt;
    do_syscall(0x16, (uint64)child);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void thread_join_all() {&lt;br /&gt;
    do_syscall(0x17);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RISCV.cpp (handleSupervisorTrap) ====&lt;br /&gt;
Dodate nove case grane u switch (posle case 0x13 dispatch):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
case 0x16: {&lt;br /&gt;
    TCB *child = (TCB*)arg1;&lt;br /&gt;
    TCB::addChild(TCB::running, child);&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
case 0x17: {&lt;br /&gt;
    TCB::joinAllChildren();&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syscall_cpp.hpp ====&lt;br /&gt;
Dodate metode u klasu &amp;lt;code&amp;gt;Thread&amp;lt;/code&amp;gt; (public sekcija):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void addChild(Thread* child);&lt;br /&gt;
void joinAll();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== syscall_cpp.cpp ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void Thread::addChild(Thread* child) {&lt;br /&gt;
    thread_add_child(child-&amp;gt;getMyHandle());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Thread::joinAll() {&lt;br /&gt;
    thread_join_all();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Test primer ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;../h/syscall_cpp.hpp&amp;quot;&lt;br /&gt;
#include &amp;quot;../h/syscall_c.hpp&amp;quot;&lt;br /&gt;
#include &amp;quot;../h/printing.hpp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class ThreadC : public Thread {&lt;br /&gt;
public:&lt;br /&gt;
    ThreadC(int id) : Thread(), id(id) {}&lt;br /&gt;
private:&lt;br /&gt;
    int id;&lt;br /&gt;
    void run() override {&lt;br /&gt;
        printString(&amp;quot;    C&amp;quot;);&lt;br /&gt;
        printInt(id);&lt;br /&gt;
        printString(&amp;quot; started\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        volatile int sum = 0;&lt;br /&gt;
        for (int i = 0; i &amp;lt; 3000; i++)&lt;br /&gt;
            for (int j = 0; j &amp;lt; 3000; j++)&lt;br /&gt;
                sum += j;&lt;br /&gt;
&lt;br /&gt;
        printString(&amp;quot;    C&amp;quot;);&lt;br /&gt;
        printInt(id);&lt;br /&gt;
        printString(&amp;quot; finished\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class ThreadB : public Thread {&lt;br /&gt;
public:&lt;br /&gt;
    ThreadB(int id) : Thread(), id(id) {}&lt;br /&gt;
private:&lt;br /&gt;
    int id;&lt;br /&gt;
    void run() override {&lt;br /&gt;
        printString(&amp;quot;  B&amp;quot;);&lt;br /&gt;
        printInt(id);&lt;br /&gt;
        printString(&amp;quot; started, creating 3 C children\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ThreadC* c[3];&lt;br /&gt;
        for (int i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
            c[i] = new ThreadC(id * 10 + i);&lt;br /&gt;
            c[i]-&amp;gt;start();&lt;br /&gt;
            this-&amp;gt;addChild(c[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printString(&amp;quot;  B&amp;quot;);&lt;br /&gt;
        printInt(id);&lt;br /&gt;
        printString(&amp;quot; waiting for children...\n&amp;quot;);&lt;br /&gt;
        this-&amp;gt;joinAll();&lt;br /&gt;
&lt;br /&gt;
        printString(&amp;quot;  B&amp;quot;);&lt;br /&gt;
        printInt(id);&lt;br /&gt;
        printString(&amp;quot; all children done!\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; 3; i++) delete c[i];&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void joinAllTest() {&lt;br /&gt;
    printString(&amp;quot;A started, creating 3 B and 1 C\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    ThreadB* b[3];&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
        b[i] = new ThreadB(i);&lt;br /&gt;
        b[i]-&amp;gt;start();&lt;br /&gt;
        thread_add_child(b[i]-&amp;gt;getMyHandle());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ThreadC* c = new ThreadC(99);&lt;br /&gt;
    c-&amp;gt;start();&lt;br /&gt;
    thread_add_child(c-&amp;gt;getMyHandle());&lt;br /&gt;
&lt;br /&gt;
    printString(&amp;quot;A waiting for all children...\n&amp;quot;);&lt;br /&gt;
    thread_join_all();&lt;br /&gt;
&lt;br /&gt;
    printString(&amp;quot;\n=== A: ALL children done! ===\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; 3; i++) delete b[i];&lt;br /&gt;
    delete c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Napomena:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;start()&amp;lt;/code&amp;gt; mora biti pozvan PRE &amp;lt;code&amp;gt;addChild()&amp;lt;/code&amp;gt; jer &amp;lt;code&amp;gt;start()&amp;lt;/code&amp;gt; interno poziva &amp;lt;code&amp;gt;thread_create()&amp;lt;/code&amp;gt; koji postavlja &amp;lt;code&amp;gt;myHandle&amp;lt;/code&amp;gt;. Bez toga, &amp;lt;code&amp;gt;getMyHandle()&amp;lt;/code&amp;gt; vraća &amp;lt;code&amp;gt;nullptr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Očekivan output ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
A started, creating 3 B and 1 C&lt;br /&gt;
A waiting for all children...&lt;br /&gt;
  B0 started, creating 3 C children&lt;br /&gt;
  B0 waiting for children...&lt;br /&gt;
  B1 started, creating 3 C children&lt;br /&gt;
  B1 waiting for children...&lt;br /&gt;
  B2 started, creating 3 C children&lt;br /&gt;
  B2 waiting for children...&lt;br /&gt;
    C99 started&lt;br /&gt;
    C99 finished&lt;br /&gt;
    C0 started&lt;br /&gt;
    C0 finished&lt;br /&gt;
    C1 started&lt;br /&gt;
    C1 finished&lt;br /&gt;
    ...svi C završe...&lt;br /&gt;
  B0 all children done!&lt;br /&gt;
  B1 all children done!&lt;br /&gt;
  B2 all children done!&lt;br /&gt;
&lt;br /&gt;
=== A: ALL children done! ===&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Kako radi ====&lt;br /&gt;
Svaki TCB ima polje &amp;lt;code&amp;gt;parent&amp;lt;/code&amp;gt; (ko je roditelj) i &amp;lt;code&amp;gt;childCount&amp;lt;/code&amp;gt; (koliko dece još radi). Roditelj se blokira na semaforu (&amp;lt;code&amp;gt;childrenSem&amp;lt;/code&amp;gt;, inicijalno 0). Kad nit završi, u &amp;lt;code&amp;gt;dispatch()&amp;lt;/code&amp;gt; se dekrementira &amp;lt;code&amp;gt;parent-&amp;gt;childCount&amp;lt;/code&amp;gt;. Tek kad poslednje dete spusti brojač na 0, poziva se &amp;lt;code&amp;gt;sem_signal()&amp;lt;/code&amp;gt; koji deblokirara roditelja.&lt;/div&gt;</summary>
		<author><name>Bambula</name></author>
	</entry>
</feed>