无法与第三方库一起暂停线程

时间:2012-12-13 17:24:36

标签: c++ multithreading

我遇到了一个封闭源第三方库的问题并暂停了一个线程:我在使用这个第三方库时无法暂停一个线程。

操作系统是Ubuntu 32位。编译器是g ++。

下面的代码很简单,工作正常。

#include <chrono>
#include <thread>

int main()
{
    std::chrono::seconds duration(3);
    std::this_thread::sleep_for(duration);
}

我用它编译了它:

g++ -std=c++0x test1.cpp -o test1

好的,现在有第三方库(来自AVT的GigE Vision Devices的“PvApi”)和我的以下代码。

#include <chrono>
#include <thread>
#include <PvApi.h>

int main()
{
  PvInitialize();

  std::chrono::seconds duration(3);
  std::this_thread::sleep_for(duration);
}

我用它编译了它:

g++ -std=c++0x -D_x86 -D_LINUX -D_REENTRANT test2.cpp -lPvAPI -o test2

运行代码时它确实运行了!它只是暂停一纳秒。为什么???

感谢任何提示!

2 个答案:

答案 0 :(得分:1)

这可能为时已晚,无法提供帮助,但这里有一笔交易:PvInitialize()显然在幕后运行了一个timer_create(),这会产生频繁的SIGALRM,它会中断sleep()(或usleep(),这两者都是真的叫nanosleep())。我所知道的唯一解决方法是使用nanosleep()(这是AVT的示例代码使用的)。如果你看一下nanosleep()的手册页,它需要两个参数,都是指向timespec结构的指针。发生的事情是,当睡眠中断时,第二次指示包含剩余的时间(即,假设睡眠的时间多长)。以下代码段取自AVT的示例代码:

/ *时间以毫秒为单位* /

void Sleep(unsigned int time) {         struct timespec t,r;

    t.tv_sec    = time / 1000;
    t.tv_nsec   = (time % 1000) * 1000000;

    while(nanosleep(&t,&r)==-1)
            t = r;

}

您可以使用它代替所有睡眠(),它应该处理您的大多数问题,但要注意其他可能无法防范此问题的图书馆。您想要处理的另一个地方是select()调用。

答案 1 :(得分:-1)

PvInitialize是否可能处理OS发送的任何信号?这会停止您的进程休眠。