src/
testcgowin/
cthread.go // Go 代碼
cthread_windows.c // C 代碼
testcgowin.go // 主程序
Go 文件頂部緊跟package聲明:
// extern void doAdd(int, int);
import "C"
// extern ...:聲明 C 函數供 Go 調用,等同#include頭文件。import "C":觸發 cgo 處理,**必須緊跟上一行,中間無空行**。
//export Add
func Add(x int) {
sum.Lock()
sum.i += x
sum.Unlock()
var p *int
*p = 2 // 故意 panic 測試 recover
}
//export Add:標記導出,C 端可直接調用Add。undefined reference to 'Add'。
// cthread_windows.c
#define WIN32_LEAN_AND_MEAN
#include
#include
#include "_cgo_export.h" // cgo 生成的頭文件,含 Go 導出函數聲明
static unsigned int __stdcall addThread(void *arg) {
int max = *(int*)arg;
for (int i = 0; i < max; i++) Add(i);
return 0;
}
void doAdd(int max, int nthread) {
HANDLE threads[20];
for (int i = 0; i < nthread; i++)
threads[i] = (HANDLE)_beginthreadex(NULL, 0, addThread, &max, 0, NULL);
for (int i = 0; i < nthread; i++) {
WaitForSingleObject(threads[i], INFINITE);
CloseHandle(threads[i]);
}
}
#include "_cgo_export.h":獲取 Go 導出函數聲明。static修飾內部線程函數,避免符號污染。_beginthreadex/WaitForSingleObject。go generate或go build觸發 cgo,生成_obj/、_cgo_export.h。go install產出testcgowin.a靜態庫。import "testcgowin"調用TestCthread()。//extern和//export註釋驅動 cgo 代碼生成。int↔Cint,指針傳遞需unsafe.Pointer。