Save week2
							parent
							
								
									f5d40dfc3a
								
							
						
					
					
						commit
						1eb4871631
					
				@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Raca condition is when multiple threads are trying to access and manipulat the same variable.
 | 
				
			||||||
 | 
					In the code below, main, add_one and sub_one are all accessing and changing the value of x.
 | 
				
			||||||
 | 
					Due to the uncertainty of Goroutine scheduling mechanism, the results of the following program is unpredictable.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func add_one(pt *int) {
 | 
				
			||||||
 | 
						(*pt)++
 | 
				
			||||||
 | 
						fmt.Println(*pt)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sub_one(pt *int) {
 | 
				
			||||||
 | 
						(*pt)--
 | 
				
			||||||
 | 
						fmt.Println(*pt)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						i := 0
 | 
				
			||||||
 | 
						go add_one(&i)
 | 
				
			||||||
 | 
						go sub_one(&i)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						i++
 | 
				
			||||||
 | 
						fmt.Println()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					// A race condition occurs in this program because two goroutines are attempting
 | 
				
			||||||
 | 
					// to access a variable in shared memory `counter` concurrently.
 | 
				
			||||||
 | 
					// One would expect that the value of coutner at the end of the run would be
 | 
				
			||||||
 | 
					// 10,000 * 2 = 20,000 and on some runs it will produce this value. On other runs
 | 
				
			||||||
 | 
					// one gorountine will read the counter value just before the second goroutine
 | 
				
			||||||
 | 
					// writes to the shared variable. When the first goroutine writes it's counter value + 1
 | 
				
			||||||
 | 
					// it overwrites the counter value with an older value + 1. This results in some runs
 | 
				
			||||||
 | 
					// producing a counter result 1000s of values lower than expected.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var counter int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						var wg sync.WaitGroup
 | 
				
			||||||
 | 
						wg.Add(2)
 | 
				
			||||||
 | 
						goroutine_count := 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for i := 0; i < goroutine_count; i++ {
 | 
				
			||||||
 | 
							go func() {
 | 
				
			||||||
 | 
								for i := 0; i < 10000; i++ {
 | 
				
			||||||
 | 
									counter = counter + 1
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								wg.Done()
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wg.Wait()
 | 
				
			||||||
 | 
						fmt.Println("Counter:", counter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					// A race condition occurs in this program because two goroutines are attempting
 | 
				
			||||||
 | 
					// to access a variable in shared memory `counter` concurrently.
 | 
				
			||||||
 | 
					// One would expect that the value of coutner at the end of the run would be
 | 
				
			||||||
 | 
					// 10,000 * 2 = 20,000 and on some runs it will produce this value. On other runs
 | 
				
			||||||
 | 
					// one gorountine will read the counter value just before the second goroutine
 | 
				
			||||||
 | 
					// writes to the shared variable. When the first goroutine writes it's counter value + 1
 | 
				
			||||||
 | 
					// it overwrites the counter value with an older value + 1. This results in some runs
 | 
				
			||||||
 | 
					// producing a counter result 1000s of values lower than expected.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var counter int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						var wg sync.WaitGroup
 | 
				
			||||||
 | 
						wg.Add(2)
 | 
				
			||||||
 | 
						goroutine_count := 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for i := 0; i < goroutine_count; i++ {
 | 
				
			||||||
 | 
							go func() {
 | 
				
			||||||
 | 
								for i := 0; i < 10000; i++ {
 | 
				
			||||||
 | 
									counter = counter + 1
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								wg.Done()
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wg.Wait()
 | 
				
			||||||
 | 
						fmt.Println("Counter:", counter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
					Loading…
					
					
				
		Reference in New Issue