在共享库中阻止Go例程

时间:2016-05-23 16:36:42

标签: multithreading go block condition-variable

我有共享库,它提供了一个在处理过程中进入等待状态的功能。等待是由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打电话?

1 个答案:

答案 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。