我想使用c ++在多个线程中使用单个对象。我从java中知道线程共享所有变量,但似乎在c ++中它是不同的。
我有以下结构来存储日期
Class Flow: has multiple integers
Class UE: has a list<Flow*>
Class FlowTable: has a map<int,UE*>
现在有两个线程(对象:InOutReader和OutInReader),每个线程都有一个FlowTable *,并且应该向FlowTable读取和/或插入数据。
在我的启动器的main()中,我调用新的FlowTable(),创建线程对象,并使用setter为它们提供FlowTable *。但最终看起来两个线程使用不同的FlowTable对象。
class InOutReader{
public:
start(){
while(true){
//read data from somewhere(tap-interface1)
//extract address from ip packet and tcp/udp header etc
Flow* myflow = new Flow(IPsrc,IPdest);
this->myflowTable->insertFlow(myflow);
}
}
}
class OutInReader{
public:
start(){
while(true){
//read data from somewhere(tap-interface1)
//extract address from ip packet and tcp/udp header etc
Flow* myflow = new Flow(IPsrc,IPdest);
this->myflowTable->existsFlow(myflow);// should return true if a flow with the same data was inserted before
}
}
}
主程序 FlowTable * myflowTable;
startThreadOne(){
InOutReader ior = InOutReader();
ior.setFlowTable(myFlowTable);
ior.start();
}
startThreadtwo(){
InOutReader oir = InOutReader();
oir.setFlowTable(myFlowTable);
oir.start();
}
void main(){
myFlowTable = new FlowTable();
std::thread t1 = std::thread(startThreadOne);
std::thread t2 = std::thread(startThreadtwo);
t1.join();
t2.join();
}
在多个线程中使用相同的FlowTable对象需要做什么?
答案 0 :(得分:0)
我无法解释您的解释,但如果您希望两个线程共享相同的动态分配FlowTable
,则C ++中的解决方案非常简单:
int
main()
{
FlowTable* sharedFlowTable = new FlowTable();
std::thread t1( startThread1, sharedFlowTable );
std::thread t2( startThread2, sharedFlowTable );
// ...
}
然后声明startThread1
和startThread2
以FlowTable*
作为参数。 (这比在Java中简单得多;在Java中,您必须为每个线程定义一个类,从Runnable
派生,并为每个类提供一个构造函数,该构造函数接受FlowTable
并复制它成为一个成员变量,以便run
函数可以找到它。)
编辑:
当然,如果sharedFlowTable
指向的值确实是FlowTable
,并且不涉及继承和工厂函数,则可以在main
中将其设为局部变量,而不是指针,并将&sharedFlowTable
传递给线程。这将更简单,在C ++中更惯用。 (我要感谢@ 5gon12eder指出这一点。令人尴尬的是,因为我通常是反对动态分配的人,除非有必要。)