這個例項通過迴圈實現並行的分段求和計算,再把各個子段和加到總和中。
通過這個例項可以了解如何實現迴圈並行處理,以及有關的程式設計技巧。
但是這個程式是有問題的,因為可能發生變數訪問衝突問題,導致計算結果不正確。這個程式是不穩定的,有時能夠計算出不正確的結果,有時能夠計算出正確結果。
程式中的變數sum是共享變數,需要使用同步用的互斥鎖來保證計算的正確性。正解程式附在本博文的最後。
go語言程式(不穩定,會出錯):
// loopgoroutine project main.go
package main
import (
"fmt"
"runtime"
"time"
)const start = 1
const len = 100
const step = 1000
var sum int64
func main()
for runtime.numgoroutine() > 1
fmt.printf("%d\n", sum)
}func subsum(start int, len int)
sum += ssum
}
執行結果(可能是以下兩種,也可能算出其他的結果):
5000050000
5000050000
5000050000
4713772650
程式說明:
1.這個程式總的功能是計算1到100000(len×step)的和,計算被分為step步(段)進行,通過呼叫函式subsum()計算每段之和,然後相加
2.函式subsum()計算從start開始長度為len的數列之和
3.語句"fmt.printf("%d\n", (int64(len*step) * (int64(len*step) + 1) / int64(2)))"列印輸出乙個正確的結果作為參考值
4.為了知道程式當前有幾個goroutine在執行,需要使用包"runtime",其中的方法runtime.numgoroutine()返回正在執行的goroutine的數量,需要注意的是main()本身也是乙個goroutine
5.使用包"time"中的方法time.sleep(),讓自身的goroutine
休眠,代入引數指定休眠0.1秒,因為需要等待所有其他goroutine
都執行完之後程式才能結束
6.使用互斥鎖mu來鎖住變數sum(參見程式),需要使用包"sync"
go語言程式(正解):
// loopmutex project main.go
package main
import (
"fmt"
"runtime"
"sync"
"time"
)const start = 1
const len = 100
const step = 1000
var (
mu sync.mutex
sum int64
)func main()
for runtime.numgoroutine() > 1
fmt.printf("%d\n", sum)
}func subsum(start int, len int)
mu.lock()
sum += ssum
mu.unlock()
}
C語言實現並行求和演算法
1 問題描述 將陣列a均勻劃分成m個片段,每個陣列片段最多有 n m 1 m 個元素。每個陣列片段分別由乙個執行緒負責區域性求和,最後這些部分和加起來就得到陣列中所有元素的總和。2 相關 此 在gcc4.3下編譯通過 include include include define num thread...
計算餐補(go語言實現)
最近公司需要每月計算餐補 按工作日,每日15元 然後自己去弄發票。遂寫個程式幫助自己計算工作日和這個月的全勤餐補。程式如下 公司的年假比國家的長,所以如果和我不是一家公司的話需要復用還需要自行修改holiday和specialday陣列 package main import os fmt time...
服務計算 Go語言實現selpg
3.程式測試 4.參考資料 使用golang開發linux命令列中的selpg io,實現了一系列非平台相關的 io 相關介面和實現,比如提供了對 os 中系統相關的 io 功能的封裝。我們在進行流式讀寫 比如讀寫檔案 時,通常會用到該包。os exec,執行外部命令,它包裝了 os.startpr...