>
> *> "Here's another way: https://play.golang.org/p/gEDef3LolAZ
> <https://play.golang.org/p/gEDef3LolAZ> "*
Hi all,
I think the second example alternative given (playground link above) has a
data race?
Sample race detector run just now. (The two reports are inverses of each
other: read then write vs. write then read).
-----------------------------------------------------------------------
go run -race stop_flag_from_gonuts.go
. . . . . quit sending ...
after quit sent==================
.
WARNING: DATA RACE
Write at 0x00c042072000 by goroutine 8:
main.f.func1()
C:/cygwin64/bin/gonuts/stop_flag_from_gonuts.go:13 +0x59
Previous read at 0x00c042072000 by goroutine 6:
main.f()
C:/cygwin64/bin/gonuts/stop_flag_from_gonuts.go:17 +0x102
Goroutine 8 (running) created at:
main.f()
C:/cygwin64/bin/gonuts/stop_flag_from_gonuts.go:11 +0x8a
Goroutine 6 (running) created at:
main.main()
C:/cygwin64/bin/gonuts/stop_flag_from_gonuts.go:28 +0x70
==================
==================
WARNING: DATA RACE
Read at 0x00c042072000 by goroutine 6:
main.f()
C:/cygwin64/bin/gonuts/stop_flag_from_gonuts.go:17 +0x102
Previous write at 0x00c042072000 by goroutine 8:
main.f.func1()
C:/cygwin64/bin/gonuts/stop_flag_from_gonuts.go:13 +0x59
Goroutine 6 (running) created at:
main.main()
C:/cygwin64/bin/gonuts/stop_flag_from_gonuts.go:28 +0x70
Goroutine 8 (finished) created at:
main.f()
C:/cygwin64/bin/gonuts/stop_flag_from_gonuts.go:11 +0x8a
==================
quit called
Found 2 data race(s)
exit status 66
-----------------------------------------------------------------------
--thepudds
On Friday, March 16, 2018 at 11:04:38 AM UTC-4, [email protected] wrote:
>
> While this is running, your select won't be receiving on the quit
>> channel, even if it is non-nil.
>> If you want to be able to cancel it, you'll need to make the code in
>> the loop responsive to the quit channel
>> (for example, by using a select like you're using in f already).
>
>
> The default select case does it: https://play.golang.org/p/jlfaXu6TZ8L
>
> Here's another way: https://play.golang.org/p/gEDef3LolAZ
>
> Matt
>
> On Friday, March 16, 2018 at 9:45:00 AM UTC-5, Sathish VJ wrote:
>>
>> All the examples I've seen use some kind of ticker to run various cases
>> of a select statement. But how does one run a long running task that is
>> still cancelable?
>>
>>
>> In the example below the quit part is never reached.
>>
>> https://play.golang.org/p/PLGwrUvKaqn (it does not run properly on
>> play.golang.org).
>>
>> package main
>>
>>
>> import (
>> "fmt"
>> "os"
>> "time"
>> )
>>
>>
>> func f(quit chan bool) {
>> for {
>> select {
>> case <-time.After(0 * time.Second):
>> // start long running task immediately.
>> for {
>> time.Sleep(500 * time.Millisecond)
>> fmt.Printf(". ")
>> }
>> case <-quit:
>> fmt.Println("quit called")
>> //deallocate resources in other long running task and then return
>> from function.
>> os.Exit(0) // or return
>> }
>> }
>> }
>>
>>
>> func main() {
>> var quit chan bool
>> go f(quit)
>>
>>
>> println("quit sending ... ")
>> quit <- true
>> println("after quit sent")
>>
>>
>> var i chan int
>> <-i
>> }
>>
>>
>>
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.