What sync object should i use?

Heinz thor587 at gmail.com
Mon May 13 12:51:54 PDT 2013


On Monday, 13 May 2013 at 19:41:48 UTC, Heinz wrote:
> Hi,
>
> I'm looking for an object in "core.sync" whose internal counter 
> can be 0 or 1 (signaled/not signaled), just like Event Objects 
> in Win32 
> (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682396%28v=vs.85%29.aspx). 
> The object must be waitable and able to notify waiters. A 
> semaphore is the most similar thing but its internal counter 
> can range from 0 to x. I can perfectly create and use an event 
> under Win32 for my needs but i do not know their counterparts 
> in FreeVSD, Linux and OSX; that's why i'm trying to use an 
> already implemented object from the runtime.
>
> This is what i'm trying to do:
>
> void MyFunc()
> {
>
> }

Damn, i hit enter and posted before completion, fail! Here's the 
code:

/////////////////////////////////////////////////
bool do_loop;

// This function runs in its own thread.
void MyFunc()
{
	while(true)
	{
		if(!do_loop)
			myobject.wait(); // Wait for sync object.
		// ... Do other stuff. "do_loop" can be set to false again here.
	}
}

// This one is called by different threads.
void loop(bool val)
{
	do_loop = val;
	if(do_loop) // Release sync object if it is waiting.
		myobject.notify();
}
/////////////////////////////////////////////////

The idea is that i have a code that loops and do a lot of stuff 
but sometimes i don't want it to loop so i set do_loop to false. 
When i want it to loop i set do_loop to true and release the 
waiting object.
The problem of using a semaphore is that if i call loop() with 
true multiple times, my code will perform extra loops until the 
internal counter gets to 0, that's why i need a 0-1 sync object.

Any suggestions?

Thank you in advance.


More information about the Digitalmars-d-learn mailing list