var gostrs []string
創(chuàng)新互聯(lián)公司致力于做網(wǎng)站、網(wǎng)站建設(shè),成都網(wǎng)站設(shè)計(jì),集團(tuán)網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇創(chuàng)新互聯(lián)公司,就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!
var cstrs []*C.char
header := (*reflect.SliceHeader)(unsafe.Pointer(cstrs))
header.Data = cstrspointer
header.Len = cstrslength
for _, cstr := range cstrs {
gostrs = append(gostrs, C.GoString(cstr))
}
window下調(diào)用API列出所有運(yùn)行的進(jìn)程 [Google Go]代碼 package main import ( "fmt" "syscall" "unsafe" "strconv" ) type ulong int32 type ulong_ptr uintptr type PROCESSENTRY32 struct { dwSize ulong cntUsage ulong th32ProcessID ulong t...
你好,使用golang寫動態(tài)庫,再使用易語言寫界面,肯定有不少人有這種想法吧;但中間有些坑,這里留下一些解決方法。
一、如何編譯?
請先安裝gcc編譯器,選擇32位
由于易語言只支持32位dll,使用64位會出錯,例如找不到此函數(shù);
必須先設(shè)置兩項(xiàng)配置:set GOARCH=386,set CGO_ENABLED=1,用cmd;
編譯命令:go build -ldflags "-s -w" -buildmode=c-shared -o dlldemo.dll dlldemo.go 。
二、形參與返回值
在go中,除了 string 特殊外,其他int、bool,等基本類型原本怎樣還是怎樣;
傳 string 與返回值 string 都改成 *C.char 類型,其他基本類型不用改;
有三個方法比較重要,C.CString 轉(zhuǎn)成c字符串,C.GoString 轉(zhuǎn)成go字符串 , C.free 釋放內(nèi)存;
只要用到 C.CString 此方法,就必須記得釋放內(nèi)存。
三、內(nèi)存泄漏
如果使用了 C.CString 卻不使用 C.free ,內(nèi)存暫用只會越來越大,最后奔潰;
釋放內(nèi)存時(shí),請不要重復(fù)取地址,例如 unsafe.Pointer(xx變量) ,這樣等于沒釋放;
也可能是vc6的原因,使用 defer 在即將出棧時(shí)釋放,會造成易語言得不到返回值;
解決方法,聲明全局變量,將結(jié)果賦值給全局變量,專門定義一個釋放函數(shù)例如FreeAll() 用于釋放!
四、如何調(diào)用
在填寫dll命令時(shí),請?jiān)谔顚?,在庫中對?yīng)命令名時(shí),前面加個 @ ,不然會出現(xiàn)棧錯誤;
每次調(diào)用返回值是文本型dll命令時(shí),請都使用前面準(zhǔn)備的 FreeAll() 釋放內(nèi)存!
通過易語言的便捷,為自己的golang小項(xiàng)目加點(diǎn)gui吧,這里留下源碼,給有需要的人。
希望能幫到你。
為了研究AQS,我們先來學(xué)習(xí)下java中cas(Compare And Swap)的基礎(chǔ)Unsafe類的使用
Unsafe產(chǎn)生于java無法向c那樣操作底層操作系統(tǒng),但一些場景又需要相關(guān)操作.所以此類提供了一些java語言對于操作系統(tǒng)內(nèi)存層面操作的API.這顯然被認(rèn)為是不安全的,所以此類是不公開的,不建議被java應(yīng)用直接使用.
但現(xiàn)實(shí)中已經(jīng)有大量的java并發(fā)相關(guān)操作的框架在使用它了....據(jù)說此類在計(jì)劃廢棄中.
Unsafe能操作內(nèi)存?這個是什么概念?都有哪些操作呢?
其實(shí)最明顯的是它大量方法都是直接操作內(nèi)存地址進(jìn)行操作的.方法可以分為下面幾類:
我們可以使用LockSupport類進(jìn)行操作
a. LockSupport.park()對應(yīng)Unsafe的Unsafe.park(false, 0L)------給當(dāng)前所在線程加鎖,第一個參數(shù)表示true為精度型單位為納秒,false單位毫秒,第二次參數(shù)表示等待時(shí)間;
b. LockSupport.park.unpark ---------Thread thread對應(yīng)Unsafe的UNSAFE.unpark(thread)方法(解鎖指定線程)
如果,我們直接使用Unsafe,是這樣子的:
我們還可以通過Unsafe類獲取對象的屬性值.因?yàn)閁nsafe類是直接操作內(nèi)存的,所以需要我們獲得對應(yīng)的屬性內(nèi)存地址,如下操作:
如下操作,通過unsafe類實(shí)現(xiàn)cas原子操作.
好了,上面就是unsafe的基本幾種使用,其也是aqs框架中cas操作的基礎(chǔ).下面我們進(jìn)行aqs相關(guān)學(xué)習(xí).
AQS研究系列(二)--線程狀態(tài)和interrupt()、interrupted()、isInterrupted等方法學(xué)習(xí)
AQS研究系列(三)--AbstractQueuedSynchronizer源碼分析