W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
package rand
/*
#include <stdlib.h>
*/
import "C"
func Random() int {
return int(C.random())
}
func Seed(i int) {
C.srandom(C.uint(i))
}
rand包導(dǎo)入了"C",但是在Go的標(biāo)準(zhǔn)庫(kù)中并沒(méi)有一個(gè)"C"包。這是因?yàn)?C"是一個(gè)偽包,這是一個(gè)特殊的名字,cgo通過(guò)這個(gè)包知道它是引用C命名空間的。Go編譯器使用符號(hào)"·"來(lái)區(qū)分命名空間,而C編譯器使用不同的約定,因此使用C包中的名字時(shí),Go編譯器就知道應(yīng)該使用C的命名約定。
在將要進(jìn)入這一章之前,請(qǐng)讀者先思考下面一些問(wèn)題:
Go使用的是分段棧,初始棧大小很小,當(dāng)發(fā)現(xiàn)棧不夠時(shí)會(huì)動(dòng)態(tài)增長(zhǎng)。動(dòng)態(tài)增長(zhǎng)是通過(guò)進(jìn)入函數(shù)時(shí)插入檢測(cè)指令實(shí)現(xiàn)的。然而C函數(shù)不使用分段棧技術(shù),并且假設(shè)棧是足夠大的。那么Go是如何處理不讓cgo調(diào)用發(fā)生棧溢出的呢?
Go中的goroutine都是協(xié)作式的,運(yùn)行到調(diào)用runtime庫(kù)時(shí)就有機(jī)會(huì)進(jìn)行調(diào)度。然而C函數(shù)是不會(huì)與Go的runtime做這種交互的,所以cgo的函數(shù)不是一個(gè)協(xié)作式的,那么如何避免進(jìn)入C函數(shù)的這個(gè)goroutine“失控”?
cgo不僅僅是從Go調(diào)用C,還包括從C中調(diào)用Go函數(shù)。這里面又有哪些技術(shù)難點(diǎn)?舉個(gè)簡(jiǎn)單的例子,C中調(diào)用Go函數(shù)f,而f中是使用了go建立新的goroutine的,但是在C中是不支持Go的runtime的。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: