2016-05-23 75 views
1

我有共享庫,它提供了一個在處理期間將進入等待狀態的函數。等待由C++提供的條件變量實現。任何人都知道如何從Go中正確調用這個函數?共享庫中的Block Go例程

C++函數:

我有一個隊列來存儲所有要被處理的任務。

queue<Task> tasks; 
Mutex mutex; 
condition_variable cv; 

void process(string img_path) { 
    std::unique_lock<Mutex> lock(mutex); 
    Task task(img_path); 
    tasks.push_back(task); 
    cv.wait(); //wait the task to be processed, because i have to process the tasks in a batch way using GPU 
} 

上面的代碼只是用來說明關鍵組件,它是條件變量的阻塞等待函數。它將被編譯成一個動態庫。如果從Python中調用,我發現在here中說明了一個解決方案。任何人都知道如何從Golang打電話?

+6

你可以分享一些代碼,以便我們更好地瞭解你打算做什麼? – Sean

+0

謝謝你的幫助。我已經更新了這個問題。 – Yue

回答

0

我認爲你的問題歸結爲cgo和條件變量只是模糊的東西。作爲你能做什麼的一個小例子,考慮一個go程序和一個從C++文件構建的庫。

package main 

// #cgo LDFLAGS: func.so 
// void someFunc(); 
import "C" 

import (
    "fmt" 
    "time" 
) 

func main() { 
    fmt.Printf("Before C stuff.\n") 

    t0 := time.Now() 
    C.someFunc() 
    fmt.Printf("%v\n", time.Now().Sub(t0)) 
} 

而且現在的C++文件:

#include <iostream> 
#include <unistd.h> 

extern "C" { 
    void someFunc(); 
}  
void someFunc() { 
    sleep(10); 
    std::cout << "And print something\n"; 
} 

構建並運行它像這樣:

% g++ -Wall -Wextra -o func.o -c func.cc -fPIC 
% gcc -Wall -Wextra -o func.so -shared func.o 
% go build 
% LD_LIBRARY_PATH=. ./cgofun 
Before C stuff.         
And print something 
10.000273351s 

使用,你應該能夠同樣的方法來調用一個函數塊上一個條件變量。 go運行時間不會在意,只要有必要就會阻止調用goroutine。