[chuck-users] Question on Shred Scheduling

Spencer Salazar ssalazar at princeton.edu
Mon Jun 12 19:12:26 EDT 2006


On Jun 12, 2006, at 2:44 PM, Mike McGonagle wrote:
> So, what I would like to know is how the following code would execute.
> now + 0::ms => now;
> Would this push the execution of the code to follow to the end of the
> current time slice? Or is this functionality undefined, and would it
> execute these shreds in an arbitrary fashion?

Im not sure what that would do, but check out me.yield(), I think  
that serves exactly such a purpose.

> (this is embedded in an object)
> false => int locked;
> false => int keepGoing;
> MController @ controllers[];  // this gets initialized to match the
> number of controlled parameters
> fun void helper(....) {
>    true => keepGoing;
>    while(keepGoing) {
>       while(locked) {
>          now + 0::ms => now;
>       }
>       true => locked;
>       for(0 => int i; i < controllers.cap(); i++) {
>          if (controllers[i] != null) {
>             <<< "do something with this controller", "" >>>;
>          }
>       }
>       false => locked;
>    }
> }

Hmm, i see a few potential issues here.  helper() never allows for  
the passage of time, which might be a problem, unless keepGoing is  
set to false relatively quickly.  If time doesnt advance within the  
helper shred, time cant advance for other shreds.

Secondly, I dont think your locking mechanism is guaranteed to work  
all of the time.  In this code:

>       while(locked) {
>          now + 0::ms => now;
>       }
>       // point A
>       true => locked;

what if another shred is scheduled to execute at point A?   Say this  
shred is also waiting on locked; when it is scheduled to execute,  
locked is false, so it exits from the while loop.  Both shreds would  
then proceed as if they had acquired the lock, which is probably  

Its not really possible to write a reliable mutex using standard  
control structures and variables.  It might be possible using Events,  
but I think they are really something that should be provided by the  
ChucK language (feature request!).  Until that happens, I would  
recommend trying to use Events somehow...


More information about the chuck-users mailing list