我正在使用Qt库在Linux
下编写一个应用程序。
所以,有两个QThreads
。在其中一个线程pcap_next()
函数中调用while
周期。所有线程在工作期间经常使用彼此的公共成员。
不使用pcap
库(例如从硬盘读取数据包)一切正常,但当我尝试将pcap的函数放入单独的thread
时,我有SEGFAULT错误。
我无法理解pcap
的工作原理。它看起来像pcap
冻结整个过程,因此线程无法访问彼此的公共成员。
pcap线程的主run()
函数如下:
while()
{
Data = pcap_next(handle, &header);
if (Data...)
{
//processing functions
}
}
任何想法?
答案 0 :(得分:2)
“冻结整个过程”会阻止其他线程进行运行;它不会导致进程崩溃。
如果您的程序在多个线程中的单个pcap_t
上同时进行调用,除了pcap_breakloop()
之外的某些安全调用(不会中断被阻止的线程),您需要在UN * X中发出信号来做到这一点),无法保证它能够正常工作。
如果您从未在不同线程中的同一pcap_t
上同时进行pcap调用,则应该可以正常工作。
即,您可以在一个线程中打开设备/保存文件,获得pcap_t
,并且一旦完成,就有相同的线程或另一个线程从pcap_t
读取数据包。但是,您不能让多个线程从pcap_t
读取数据包。
但是,使用pcap的方式可能有问题,即使在单线程程序中也会崩溃。我们必须看到你所有的pcap电话,看看是否是这种情况。