Go語(yǔ)言 cgo

2018-07-25 16:12 更新

下面是一個(gè)使用cgo的例子:

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)題:

  1. 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ā)生棧溢出的呢?

  2. 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“失控”?

  3. 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的。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)