Go語言實現並行分段求和計算

2021-08-04 20:33:15 字數 1796 閱讀 6438

這個例項通過迴圈實現並行的分段求和計算,再把各個子段和加到總和中。

通過這個例項可以了解如何實現迴圈並行處理,以及有關的程式設計技巧。

但是這個程式是有問題的,因為可能發生變數訪問衝突問題,導致計算結果不正確。這個程式是不穩定的,有時能夠計算出不正確的結果,有時能夠計算出正確結果。

程式中的變數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...