我正在为路由器编写代码,我想在接收器线程上接收到数据包后,将该数据包(截至目前为“unsigned char *”类型)存储在向量中。我有两个接收器线程,它们链接到两个不同的接口,并且接收器线程应该仅在另一个线程尚未访问向量时才存储接收到的数据包。
除了两个接收线程之外,我将有一个处理数据包的主线程和两个发送线程,一个用于每个接口。总线程数为 5。为了防止不同线程在从向量中写入或读取时出现问题,我听说了一个互斥锁,它应该为其他(在这种情况下)线程锁定向量,直到有问题的线程之后从向量中读取或写入。
我想知道的是这是如何处理成代码的。一些例子将不胜感激。我对 C++、Boost 和 Raw Sockets 都很陌生。最重要的是,我还不太喜欢在 C++ 中使用不同的类。我非常了解它们在 Java 和 C# 中的工作方式,但我发现 C++ 非常不同(因为头文件)。我将所有代码都放在一个巨大的主类中,这可能不是很好的编码风格,但这就是它现在的工作方式。
我应该创建一个类(.h 和 .cpp 文件)来处理这个向量,还是应该在我的巨型主类中实现它,如果是这样,我会很高兴有一些简单的例子。下面是我希望我的程序如何工作的示例。我已经有了 RecvThread,我可以打印出一个数据包的 MAC Hdr。
void RecvThread()
{
//receive a packet
while(true)
{
//get lock status from vector
if(vector is locked)
{
usleep(10000);
}
else
{
//lock vector
//save packet in vector
//unlock vector
}
}
}
void SendThread()
{
while(true)
{
//get lock status from vector
if(vector is locked)
{
usleep(10000);
}
else
{
//lock vector
//get packet from vector
//unlock vector
}
}
//send the packet
}
void MainThread()
{
while(true)
{
if(recv vector is empty)
{
usleep(10000);
}
else if(recv vector is locked)
{
usleep(10000);
}
else
{
//lock recv vector
//get packet in front of queue
//unlock recv vector
//process packet (update different fields)
//get packet interface (either 1 or 2)
if(send vector (matching interface) is locked)
{
usleep(10000);
}
else
{
//lock send vector (matching interface)
//save packet to send vector (matching interface)
//unlock send vector (matching interface)
}
}
}
}
int main()
{
//create Recv vector
//create Send vector 1 and 2 (one for each interface)
//create and join RecvThread 1 and 2
//create and join SendThread 1 and 2
//create and join MainThread
}