<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=POSIX_Threads_%28pthreads%29</id>
	<title>POSIX Threads (pthreads) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=POSIX_Threads_%28pthreads%29"/>
	<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=POSIX_Threads_(pthreads)&amp;action=history"/>
	<updated>2026-08-25T05:15:51Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in dev.kaibel.net</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://dev.kaibel.net/index.php?title=POSIX_Threads_(pthreads)&amp;diff=67&amp;oldid=prev</id>
		<title>PhilKa am 21. Oktober 2025 um 14:02 Uhr</title>
		<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=POSIX_Threads_(pthreads)&amp;diff=67&amp;oldid=prev"/>
		<updated>2025-10-21T14:02:38Z</updated>

		<summary type="html">&lt;p&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;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 21. Oktober 2025, 16:02 Uhr&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-l2&quot;&gt;Zeile 2:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 2:&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;&amp;#039;&amp;#039;&amp;#039;POSIX Threads&amp;#039;&amp;#039;&amp;#039; (kurz: &amp;#039;&amp;#039;&amp;#039;pthreads&amp;#039;&amp;#039;&amp;#039;) sind eine standardisierte Programmierschnittstelle zur Verwendung von Threads in Unix-ähnlichen Betriebssystemen (Linux, macOS, BSD, etc.).   &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;#039;&amp;#039;&amp;#039;POSIX Threads&amp;#039;&amp;#039;&amp;#039; (kurz: &amp;#039;&amp;#039;&amp;#039;pthreads&amp;#039;&amp;#039;&amp;#039;) sind eine standardisierte Programmierschnittstelle zur Verwendung von Threads in Unix-ähnlichen Betriebssystemen (Linux, macOS, BSD, etc.).   &lt;/div&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;Sie sind in der &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;**&lt;/del&gt;POSIX-Norm (IEEE 1003.1c)&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;** &lt;/del&gt;definiert und bilden die Grundlage für Multithreading in der Programmiersprache C auf diesen Systemen.&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;Sie sind in der &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&lt;/ins&gt;POSIX-Norm (IEEE 1003.1c)&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039; &lt;/ins&gt;definiert und bilden die Grundlage für Multithreading in der Programmiersprache C auf diesen Systemen.&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;---&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;---&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;== Grundprinzip ==&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;== Grundprinzip ==&lt;/div&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;Ein &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;**&lt;/del&gt;Thread&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;** &lt;/del&gt;ist ein leichtgewichtiger Ausführungspfad innerhalb eines Prozesses.   &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;Ein &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&lt;/ins&gt;Thread&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039; &lt;/ins&gt;ist ein leichtgewichtiger Ausführungspfad innerhalb eines Prozesses.   &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;Alle Threads eines Prozesses:&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;Alle Threads eines Prozesses:&lt;/div&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;* teilen sich den &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;**&lt;/del&gt;Adressraum&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;** &lt;/del&gt;(Variablen, Speicher, offene Dateien),&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;* teilen sich den &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&lt;/ins&gt;Adressraum&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039; &lt;/ins&gt;(Variablen, Speicher, offene Dateien),&lt;/div&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;* besitzen aber jeweils einen eigenen &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;**&lt;/del&gt;Stack&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;** &lt;/del&gt;und &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;**&lt;/del&gt;Befehlszähler&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;**&lt;/del&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;* besitzen aber jeweils einen eigenen &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&lt;/ins&gt;Stack&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039; &lt;/ins&gt;und &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&lt;/ins&gt;Befehlszähler&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&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;&amp;lt;pre&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;&amp;lt;pre&amp;gt;&lt;/div&gt;&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-l138&quot;&gt;Zeile 138:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 138:&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;== Synchronisation mit Mutex ==&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;== Synchronisation mit Mutex ==&lt;/div&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;Da Threads denselben Speicher teilen, können sie gleichzeitig auf dieselben Variablen zugreifen → &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;**&lt;/del&gt;Race Conditions&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;**&lt;/del&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;Da Threads denselben Speicher teilen, können sie gleichzeitig auf dieselben Variablen zugreifen → &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&lt;/ins&gt;Race Conditions&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&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;div&gt;Ein &amp;#039;&amp;#039;&amp;#039;Mutex&amp;#039;&amp;#039;&amp;#039; (Mutual Exclusion Lock) schützt kritische Abschnitte.&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;Ein &amp;#039;&amp;#039;&amp;#039;Mutex&amp;#039;&amp;#039;&amp;#039; (Mutual Exclusion Lock) schützt kritische Abschnitte.&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;/table&gt;</summary>
		<author><name>PhilKa</name></author>
	</entry>
	<entry>
		<id>http://dev.kaibel.net/index.php?title=POSIX_Threads_(pthreads)&amp;diff=62&amp;oldid=prev</id>
		<title>PhilKa: Die Seite wurde neu angelegt: „= POSIX Threads (pthreads) =  &#039;&#039;&#039;POSIX Threads&#039;&#039;&#039; (kurz: &#039;&#039;&#039;pthreads&#039;&#039;&#039;) sind eine standardisierte Programmierschnittstelle zur Verwendung von Threads in Unix-ähnlichen Betriebssystemen (Linux, macOS, BSD, etc.).   Sie sind in der **POSIX-Norm (IEEE 1003.1c)** definiert und bilden die Grundlage für Multithreading in der Programmiersprache C auf diesen Systemen.  ---  == Grundprinzip == Ein **Thread** ist ein leichtgewichtiger Ausführungspfad innerhalb…“</title>
		<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=POSIX_Threads_(pthreads)&amp;diff=62&amp;oldid=prev"/>
		<updated>2025-10-21T13:12:18Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „= POSIX Threads (pthreads) =  &amp;#039;&amp;#039;&amp;#039;POSIX Threads&amp;#039;&amp;#039;&amp;#039; (kurz: &amp;#039;&amp;#039;&amp;#039;pthreads&amp;#039;&amp;#039;&amp;#039;) sind eine standardisierte Programmierschnittstelle zur Verwendung von Threads in Unix-ähnlichen Betriebssystemen (Linux, macOS, BSD, etc.).   Sie sind in der **POSIX-Norm (IEEE 1003.1c)** definiert und bilden die Grundlage für Multithreading in der Programmiersprache C auf diesen Systemen.  ---  == Grundprinzip == Ein **Thread** ist ein leichtgewichtiger Ausführungspfad innerhalb…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= POSIX Threads (pthreads) =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;POSIX Threads&amp;#039;&amp;#039;&amp;#039; (kurz: &amp;#039;&amp;#039;&amp;#039;pthreads&amp;#039;&amp;#039;&amp;#039;) sind eine standardisierte Programmierschnittstelle zur Verwendung von Threads in Unix-ähnlichen Betriebssystemen (Linux, macOS, BSD, etc.).  &lt;br /&gt;
Sie sind in der **POSIX-Norm (IEEE 1003.1c)** definiert und bilden die Grundlage für Multithreading in der Programmiersprache C auf diesen Systemen.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Grundprinzip ==&lt;br /&gt;
Ein **Thread** ist ein leichtgewichtiger Ausführungspfad innerhalb eines Prozesses.  &lt;br /&gt;
Alle Threads eines Prozesses:&lt;br /&gt;
* teilen sich den **Adressraum** (Variablen, Speicher, offene Dateien),&lt;br /&gt;
* besitzen aber jeweils einen eigenen **Stack** und **Befehlszähler**.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+-----------------------------+&lt;br /&gt;
|        Prozess              |&lt;br /&gt;
|-----------------------------|&lt;br /&gt;
|  Code, Daten, Heap, Files   |&lt;br /&gt;
|-----------------------------|&lt;br /&gt;
|  Thread 1 → Stack1          |&lt;br /&gt;
|  Thread 2 → Stack2          |&lt;br /&gt;
|  Thread 3 → Stack3          |&lt;br /&gt;
+-----------------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
→ Dadurch sind Threads effizienter als separate Prozesse, aber erfordern sorgfältige Synchronisation.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Header-Datei ==&lt;br /&gt;
Alle pthread-Funktionen sind in der Header-Datei enthalten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;pthread.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Kompilieren muss oft die pthread-Bibliothek explizit eingebunden werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
gcc main.c -o main -pthread&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Wichtige pthread-Funktionen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Funktion !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pthread_create()&amp;lt;/code&amp;gt; || Erzeugt einen neuen Thread&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pthread_exit()&amp;lt;/code&amp;gt; || Beendet den aktuellen Thread&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pthread_join()&amp;lt;/code&amp;gt; || Wartet auf die Beendigung eines anderen Threads&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pthread_detach()&amp;lt;/code&amp;gt; || Trennt Thread (keine join-Wartung mehr möglich)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pthread_self()&amp;lt;/code&amp;gt; || Liefert ID des aktuellen Threads&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pthread_mutex_init()&amp;lt;/code&amp;gt; || Initialisiert einen Mutex (Sperre)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pthread_mutex_lock()&amp;lt;/code&amp;gt; || Sperrt kritischen Bereich&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pthread_mutex_unlock()&amp;lt;/code&amp;gt; || Gibt Sperre frei&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pthread_cond_wait()&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;pthread_cond_signal()&amp;lt;/code&amp;gt; || Bedingungsvariablen zur Synchronisation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Einfacher Thread ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pthread.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void* thread_func(void* arg) {&lt;br /&gt;
    int id = *(int*)arg;&lt;br /&gt;
    printf(&amp;quot;Thread %d läuft!\n&amp;quot;, id);&lt;br /&gt;
    pthread_exit(NULL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    pthread_t thread;&lt;br /&gt;
    int id = 1;&lt;br /&gt;
&lt;br /&gt;
    // Thread erzeugen&lt;br /&gt;
    if (pthread_create(&amp;amp;thread, NULL, thread_func, &amp;amp;id) != 0) {&lt;br /&gt;
        perror(&amp;quot;pthread_create&amp;quot;);&lt;br /&gt;
        return EXIT_FAILURE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Warten, bis Thread fertig ist&lt;br /&gt;
    pthread_join(thread, NULL);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Thread beendet.\n&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ergebnis:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Thread 1 läuft!&lt;br /&gt;
Thread beendet.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Mehrere Threads ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pthread.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define N 5&lt;br /&gt;
&lt;br /&gt;
void* worker(void* arg) {&lt;br /&gt;
    int i = *(int*)arg;&lt;br /&gt;
    printf(&amp;quot;Thread %d: Hallo!\n&amp;quot;, i);&lt;br /&gt;
    return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    pthread_t threads[N];&lt;br /&gt;
    int ids[N];&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
        ids[i] = i + 1;&lt;br /&gt;
        pthread_create(&amp;amp;threads[i], NULL, worker, &amp;amp;ids[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
        pthread_join(threads[i], NULL);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Alle Threads beendet.\n&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Synchronisation mit Mutex ==&lt;br /&gt;
Da Threads denselben Speicher teilen, können sie gleichzeitig auf dieselben Variablen zugreifen → **Race Conditions**.  &lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Mutex&amp;#039;&amp;#039;&amp;#039; (Mutual Exclusion Lock) schützt kritische Abschnitte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pthread.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int counter = 0;&lt;br /&gt;
pthread_mutex_t lock;&lt;br /&gt;
&lt;br /&gt;
void* increment(void* arg) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 100000; i++) {&lt;br /&gt;
        pthread_mutex_lock(&amp;amp;lock);&lt;br /&gt;
        counter++;&lt;br /&gt;
        pthread_mutex_unlock(&amp;amp;lock);&lt;br /&gt;
    }&lt;br /&gt;
    return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    pthread_t t1, t2;&lt;br /&gt;
    pthread_mutex_init(&amp;amp;lock, NULL);&lt;br /&gt;
&lt;br /&gt;
    pthread_create(&amp;amp;t1, NULL, increment, NULL);&lt;br /&gt;
    pthread_create(&amp;amp;t2, NULL, increment, NULL);&lt;br /&gt;
&lt;br /&gt;
    pthread_join(t1, NULL);&lt;br /&gt;
    pthread_join(t2, NULL);&lt;br /&gt;
&lt;br /&gt;
    pthread_mutex_destroy(&amp;amp;lock);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Endergebnis: %d\n&amp;quot;, counter);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ohne Mutex wäre das Ergebnis unbestimmt, weil beide Threads gleichzeitig auf `counter` zugreifen würden.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Bedingungsvariablen ==&lt;br /&gt;
Mit &amp;#039;&amp;#039;&amp;#039;pthread_cond_t&amp;#039;&amp;#039;&amp;#039; lassen sich Threads blockieren, bis ein bestimmtes Ereignis eintritt.  &lt;br /&gt;
Das funktioniert immer in Kombination mit einem Mutex.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pthread.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;&lt;br /&gt;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;&lt;br /&gt;
int ready = 0;&lt;br /&gt;
&lt;br /&gt;
void* worker(void* arg) {&lt;br /&gt;
    pthread_mutex_lock(&amp;amp;lock);&lt;br /&gt;
    while (!ready) {&lt;br /&gt;
        pthread_cond_wait(&amp;amp;cond, &amp;amp;lock);  // wartet auf Signal&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;Thread wurde aktiviert!\n&amp;quot;);&lt;br /&gt;
    pthread_mutex_unlock(&amp;amp;lock);&lt;br /&gt;
    return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    pthread_t t;&lt;br /&gt;
    pthread_create(&amp;amp;t, NULL, worker, NULL);&lt;br /&gt;
&lt;br /&gt;
    sleep(2);&lt;br /&gt;
    pthread_mutex_lock(&amp;amp;lock);&lt;br /&gt;
    ready = 1;&lt;br /&gt;
    pthread_cond_signal(&amp;amp;cond); // weckt Thread&lt;br /&gt;
    pthread_mutex_unlock(&amp;amp;lock);&lt;br /&gt;
&lt;br /&gt;
    pthread_join(t, NULL);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Thread-Attribute ==&lt;br /&gt;
Mit &amp;lt;code&amp;gt;pthread_attr_t&amp;lt;/code&amp;gt; lassen sich Threads konfigurieren:&lt;br /&gt;
* Detach-State (joinable/detached)&lt;br /&gt;
* Stackgröße&lt;br /&gt;
* Scheduling-Parameter&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
pthread_attr_t attr;&lt;br /&gt;
pthread_attr_init(&amp;amp;attr);&lt;br /&gt;
pthread_attr_setdetachstate(&amp;amp;attr, PTHREAD_CREATE_DETACHED);&lt;br /&gt;
pthread_create(&amp;amp;thread, &amp;amp;attr, func, NULL);&lt;br /&gt;
pthread_attr_destroy(&amp;amp;attr);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Detached Threads ==&lt;br /&gt;
Ein „detached“ Thread kann nicht mehr per &amp;lt;code&amp;gt;pthread_join()&amp;lt;/code&amp;gt; abgefragt werden – er gibt seine Ressourcen beim Ende automatisch frei.  &lt;br /&gt;
Das ist nützlich für kurzlebige Hintergrundaufgaben.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Thread-Sicherheit und Reentranz ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Thread-safe&amp;#039;&amp;#039;&amp;#039; Funktionen dürfen von mehreren Threads gleichzeitig genutzt werden (z. B. `printf()` meist sicher).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Reentrant&amp;#039;&amp;#039;&amp;#039; Funktionen verändern keine globalen Zustände und können unterbrochen werden.&lt;br /&gt;
&lt;br /&gt;
Bei Bedarf stehen sichere Varianten zur Verfügung, z. B.:&lt;br /&gt;
&amp;lt;code&amp;gt;strtok_r()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;asctime_r()&amp;lt;/code&amp;gt; usw.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Vor- und Nachteile von POSIX Threads ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Vorteile !! Nachteile&lt;br /&gt;
|-&lt;br /&gt;
| Hohe Parallelität auf Mehrkernsystemen || Aufwendige Synchronisation&lt;br /&gt;
|-&lt;br /&gt;
| Geringer Overhead gegenüber Prozessen || Potenzielle Race Conditions&lt;br /&gt;
|-&lt;br /&gt;
| Gemeinsamer Speicher erleichtert Datenaustausch || Fehler schwer zu debuggen&lt;br /&gt;
|-&lt;br /&gt;
| Standardisiert (POSIX-konform) || Nicht auf allen Plattformen verfügbar (z. B. Windows ≠ pthreads)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Vergleich zu Prozessen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Merkmal !! Thread !! Prozess&lt;br /&gt;
|-&lt;br /&gt;
| Speicherraum || geteilt || getrennt&lt;br /&gt;
|-&lt;br /&gt;
| Startkosten || gering || hoch&lt;br /&gt;
|-&lt;br /&gt;
| Kommunikation || direkt über Speicher || über Pipes/Sockets&lt;br /&gt;
|-&lt;br /&gt;
| Stabilität || kann andere Threads abstürzen lassen || isoliert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Typische Fehler ==&lt;br /&gt;
* Vergessen, `pthread_join()` aufzurufen (führt zu Zombie-Threads)  &lt;br /&gt;
* Zugriff auf gemeinsame Daten ohne Mutex  &lt;br /&gt;
* Nicht initialisierte Synchronisationsobjekte  &lt;br /&gt;
* Rückgabewerte der pthread-Funktionen ignorieren  &lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Multithreading]]&lt;br /&gt;
* [[Race Condition]]&lt;br /&gt;
* [[Mutex (Programmierung)]]&lt;br /&gt;
* [[Semaphore]]&lt;br /&gt;
* [[POSIX (Portable Operating System Interface)]]&lt;br /&gt;
* [[Operating System (Betriebssystem)]]&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
* IEEE Std 1003.1c-1995 – POSIX Threads (pthreads)  &lt;br /&gt;
* David R. Butenhof: &amp;#039;&amp;#039;Programming with POSIX Threads&amp;#039;&amp;#039;, Addison-Wesley 1997  &lt;br /&gt;
* Stevens, W. Richard: &amp;#039;&amp;#039;Advanced Programming in the UNIX Environment&amp;#039;&amp;#039;, Prentice Hall  &lt;br /&gt;
* Linux man pages: &amp;lt;code&amp;gt;man pthread_create&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;man pthread_mutex_lock&amp;lt;/code&amp;gt;  &lt;br /&gt;
* GNU C Library Documentation&lt;/div&gt;</summary>
		<author><name>PhilKa</name></author>
	</entry>
</feed>