<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Semaphore]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich hab da mal'n kleines problemchen. Ich will Daten in einen Puffer schreiben und wieder auslesen. Schreiben und Lesen soll jeweils in einem eigenen Thread erfolgen. Wie im Quellcode zu sehen, schreibe ich alle 500 ms einen int-Wert in den Puffer. Wie bekomm ich es mit Hilfe von Semaphoren hin, dass nur dann ein Wert ausgelesen wird, wenn auch einer im Puffer steht. Mein Problem bei vergangenen Versuchen war, dass der Lesethread ständig liest, was zu einer vollen CPU-Auslastung führt.</p>
<p>Hätte vielleicht jemand nen ansatz, wie man aus der Problematik rauskommt?</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;windows.h&gt;

#define BUFFER_SIZE 10

class CCB		//Ringpufferklasse
{
private:
	int m_aiBuffer[BUFFER_SIZE];
	long m_lWritePos;
	long m_lReadPos;
public:
	CCB(void);
	~CCB(void);
	void Write(int iValue);
	int Read();
};

class CTest			//Testklasse
{
private:
	CCB &amp;m_oCBB;
public:
	CTest(CCB &amp;roCCB);
	~CTest(void);
	void Send(int iValue);
};

//Ringpufferfunktionen //////////////////////////
////////////////////////////////////////////////
CCB::CCB(void)
{
	m_lReadPos = -1;
	m_lWritePos = 0;
	for(int i=0; i&lt;BUFFER_SIZE; i++)
	{
		m_aiBuffer[i] = 0;
	}
}

CCB::~CCB(void)
{
}

void CCB::Write(int iValue)
{
	m_aiBuffer[m_lWritePos] = iValue;
	m_lWritePos++;
	if(m_lWritePos &gt;= BUFFER_SIZE)
	{
		m_lWritePos = 0;
	}
}

int CCB::Read()
{
	m_lReadPos++;
	if(m_lReadPos &gt;= BUFFER_SIZE)
	{
		m_lReadPos = 0;
	}
	return m_aiBuffer[m_lReadPos];
}

//Testklassenzeugs/////////////////////
CTest::CTest(CCB &amp;roCCB) : m_oCBB(roCCB)
{
}

CTest::~CTest(void)
{
}

void CTest::Send(int iValue)
{
	m_oCBB.Write(iValue);
	Sleep(500);
}

//Threadfunktionen///////////////
/////////////////////////////////
DWORD WINAPI WriteThread(LPVOID);
DWORD WINAPI ReadThread(LPVOID);

HANDLE g_hWriteThread, g_hReadThread, g_hSemaphore;
DWORD g_dwWriteThreadID, g_dwReadThreadID;

CCB *g_oCCB = new CCB();
CTest *g_oTest = new CTest(*g_oCCB);
bool g_bIsBufferFilled = false;

//MAIN//////////////////////
////////////////////////////
void main()
{
	g_hSemaphore = CreateSemaphore(NULL, 0, BUFFER_SIZE, NULL);
	g_hWriteThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WriteThread, NULL, 0, &amp;g_dwWriteThreadID);
	g_hReadThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReadThread, NULL, 0, &amp;g_dwReadThreadID);
}

DWORD WINAPI WriteThread(LPVOID lp)
{
	for(int i=0; i&lt;50; i++)
	{
		g_oTest-&gt;Send(i);
		g_bIsBufferFilled = true;
		ReleaseSemaphore(g_hSemaphore, 1, NULL);
	}
	g_bIsBufferFilled = false;
	return TRUE;
}

DWORD WINAPI ReadThread(LPVOID lp)
{
	while(g_bIsBufferFilled == true)
	{
		if(WaitForSingleObject(g_hSemaphore, 0) == WAIT_OBJECT_0)
		{
			printf(&quot;%d\n&quot;, g_oCCB-&gt;Read());
		}
	}
	return TRUE;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/243484/semaphore</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 06:20:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243484.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Jun 2009 11:43:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Semaphore on Wed, 17 Jun 2009 11:43:41 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich hab da mal'n kleines problemchen. Ich will Daten in einen Puffer schreiben und wieder auslesen. Schreiben und Lesen soll jeweils in einem eigenen Thread erfolgen. Wie im Quellcode zu sehen, schreibe ich alle 500 ms einen int-Wert in den Puffer. Wie bekomm ich es mit Hilfe von Semaphoren hin, dass nur dann ein Wert ausgelesen wird, wenn auch einer im Puffer steht. Mein Problem bei vergangenen Versuchen war, dass der Lesethread ständig liest, was zu einer vollen CPU-Auslastung führt.</p>
<p>Hätte vielleicht jemand nen ansatz, wie man aus der Problematik rauskommt?</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;windows.h&gt;

#define BUFFER_SIZE 10

class CCB		//Ringpufferklasse
{
private:
	int m_aiBuffer[BUFFER_SIZE];
	long m_lWritePos;
	long m_lReadPos;
public:
	CCB(void);
	~CCB(void);
	void Write(int iValue);
	int Read();
};

class CTest			//Testklasse
{
private:
	CCB &amp;m_oCBB;
public:
	CTest(CCB &amp;roCCB);
	~CTest(void);
	void Send(int iValue);
};

//Ringpufferfunktionen //////////////////////////
////////////////////////////////////////////////
CCB::CCB(void)
{
	m_lReadPos = -1;
	m_lWritePos = 0;
	for(int i=0; i&lt;BUFFER_SIZE; i++)
	{
		m_aiBuffer[i] = 0;
	}
}

CCB::~CCB(void)
{
}

void CCB::Write(int iValue)
{
	m_aiBuffer[m_lWritePos] = iValue;
	m_lWritePos++;
	if(m_lWritePos &gt;= BUFFER_SIZE)
	{
		m_lWritePos = 0;
	}
}

int CCB::Read()
{
	m_lReadPos++;
	if(m_lReadPos &gt;= BUFFER_SIZE)
	{
		m_lReadPos = 0;
	}
	return m_aiBuffer[m_lReadPos];
}

//Testklassenzeugs/////////////////////
CTest::CTest(CCB &amp;roCCB) : m_oCBB(roCCB)
{
}

CTest::~CTest(void)
{
}

void CTest::Send(int iValue)
{
	m_oCBB.Write(iValue);
	Sleep(500);
}

//Threadfunktionen///////////////
/////////////////////////////////
DWORD WINAPI WriteThread(LPVOID);
DWORD WINAPI ReadThread(LPVOID);

HANDLE g_hWriteThread, g_hReadThread, g_hSemaphore;
DWORD g_dwWriteThreadID, g_dwReadThreadID;

CCB *g_oCCB = new CCB();
CTest *g_oTest = new CTest(*g_oCCB);
bool g_bIsBufferFilled = false;

//MAIN//////////////////////
////////////////////////////
void main()
{
	g_hSemaphore = CreateSemaphore(NULL, 0, BUFFER_SIZE, NULL);
	g_hWriteThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WriteThread, NULL, 0, &amp;g_dwWriteThreadID);
	g_hReadThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReadThread, NULL, 0, &amp;g_dwReadThreadID);
}

DWORD WINAPI WriteThread(LPVOID lp)
{
	for(int i=0; i&lt;50; i++)
	{
		g_oTest-&gt;Send(i);
		g_bIsBufferFilled = true;
		ReleaseSemaphore(g_hSemaphore, 1, NULL);
	}
	g_bIsBufferFilled = false;
	return TRUE;
}

DWORD WINAPI ReadThread(LPVOID lp)
{
	while(g_bIsBufferFilled == true)
	{
		if(WaitForSingleObject(g_hSemaphore, 0) == WAIT_OBJECT_0)
		{
			printf(&quot;%d\n&quot;, g_oCCB-&gt;Read());
		}
	}
	return TRUE;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1728117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728117</guid><dc:creator><![CDATA[SuperAdmin]]></dc:creator><pubDate>Wed, 17 Jun 2009 11:43:41 GMT</pubDate></item><item><title><![CDATA[Reply to Semaphore on Wed, 17 Jun 2009 11:56:38 GMT]]></title><description><![CDATA[<p>1. Du bist im WinAPI Forum besser aufgehoben.<br />
2. Würde ich hier nicht mal eine Semaphore, sondern nur ein Event (CreateEvent(..), SetEvent(..), ResetEvent(..), WaitForSingleObject(..)) benutzen.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728123</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 17 Jun 2009 11:56:38 GMT</pubDate></item><item><title><![CDATA[Reply to Semaphore on Wed, 17 Jun 2009 12:03:02 GMT]]></title><description><![CDATA[<p>na ok, danke für den tipp...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728126</guid><dc:creator><![CDATA[SuperAdmin]]></dc:creator><pubDate>Wed, 17 Jun 2009 12:03:02 GMT</pubDate></item><item><title><![CDATA[Reply to Semaphore on Wed, 17 Jun 2009 13:45:06 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-10455.html" rel="nofollow">evilissimo</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-4.html" rel="nofollow">WinAPI</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728218</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Wed, 17 Jun 2009 13:45:06 GMT</pubDate></item><item><title><![CDATA[Reply to Semaphore on Wed, 17 Jun 2009 15:11:35 GMT]]></title><description><![CDATA[<p>Hallo SuperAdmin,</p>
<p>schau Dir mal diesen <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1234889.html#1234889" rel="nofollow">Beitrag zum Active Object</a> an. Du findest dort alle Komponenten die Du benötigst wieder. Der schreibenden Thread ist main, der lesende ist in der Methode Actor::run(). Dein int ist dort die struct Cmd, und der Buffer (bzw. die Pipe oder Queue) ist der Member Actor::m_input. Die Funktionalität des Semaphore wird mit Hilfe einer <a href="http://www.boost.org/doc/libs/1_39_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref" rel="nofollow">boost::condition</a> erledigt.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728298</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 17 Jun 2009 15:11:35 GMT</pubDate></item><item><title><![CDATA[Reply to Semaphore on Wed, 17 Jun 2009 15:49:40 GMT]]></title><description><![CDATA[<p>warum soll er denn jetzt boost benutzen. die winapi hat jawohl mehr als genug bordmittel für synchronisation. @op: was funzt an deinem code nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728326</guid><dc:creator><![CDATA[z0rer]]></dc:creator><pubDate>Wed, 17 Jun 2009 15:49:40 GMT</pubDate></item></channel></rss>