我有共享库,它提供了一个在处理过程中进入等待状态的功能。等待是由c ++提供的条件变量实现的。任何人都知道如何从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打电话?
答案 0 :(得分: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。