我遇到了一个封闭源第三方库的问题并暂停了一个线程:我在使用这个第三方库时无法暂停一个线程。
操作系统是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
运行代码时它确实运行了!它只是暂停一纳秒。为什么???
感谢任何提示!
答案 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发送的任何信号?这会停止您的进程休眠。