A scheduled control signal with fibers?

Ferhat Kurtulmuş aferust at gmail.com
Sun Sep 27 12:05:13 UTC 2020


On Sunday, 27 September 2020 at 10:40:25 UTC, Ali Çehreli wrote:
> On 9/27/20 3:06 AM, Ferhat Kurtulmuş wrote:
>
> > __gshared DList!Entry queue;
> > __gshared bool shouldRun = true;
>
> Have you considered passing messages with 
> std.concurrency.send() and std.concurrency.receive() and 
> friends? You wouldn't need 'queue' because all of your threads 
> already have mail boxes to send messages to each other.
>
> > void worker() {
> >      while(shouldRun){
> >          auto r = queue[];
> >          if(!r.empty && queue.back.st < Clock.currTime){
> >              writeln(queue.back); // consume the value
> > sendPWMSignalToValfe(pwmval)
> >              queue.popLastOf(r);
> >          }
> >      }
> > }
>
> It's not clear whether it's only in your test code but 
> busy-waiting like that will make your CPU very warm. :) Since 
> requests cannot pass each other, your worker thread should have 
> something like the following in that loop:
>
> import core.thread;
>
>   Thread.sleep(duration);
>
> Depending on how accurate the operating system honors your 
> sleep requests (e.g. is it real-time?), you may want to sleep 
> less than 'duration' and then busy-wait the rest of the 
> duration. Similar to the difference between spinForce() and 
> yieldForce() of std.parallelism (I understand that your 
> solution should not involve std.parallelism):
>
>   https://dlang.org/phobos/std_parallelism.html#.Task.spinForce
>
> As an improvement when defining durations, you don't need to 
> "hide" units in comments:
>
>         // enum afterNmilliseconds = 1500;
>
>         // Instead:
>         enum after = 1500.msecs;
>
> msecs and friends are defined in core.time:
>
>   https://dlang.org/phobos/core_time.html#.dur
>
> Ali

Yes, this solution requires less code and obviously less system 
resources.

void main() {

     while (true) {
         int v;

         "type your value: ".write;
         readf(" %d", &v);

         if(v==0){
             break;
         }

         auto childTid = spawn(&spawnedFunc, thisTid);
         send(childTid, v);
     }

     writeln("main is done.");
}

static void spawnedFunc(Tid ownerTid)
{
     receive((int v){
         Thread.sleep(1500.msecs);
         writeln(v);
     });
}

However, there is a big problem now. If I change my main like 
below, numbers are not written at the correct order after 1.5 
seconds?

void main() {
     foreach (v; 0..10){
         auto childTid = spawn(&spawnedFunc, thisTid);
         send(childTid, v);
     }
     writeln("main is done.");
}



More information about the Digitalmars-d-learn mailing list