如何在多个线程中使用单个对象?

时间:2015-02-26 12:00:39

标签: c++ multithreading object share

我想使用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对象需要做什么?

1 个答案:

答案 0 :(得分:0)

我无法解释您的解释,但如果您希望两个线程共享相同的动态分配FlowTable,则C ++中的解决方案非常简单:

int
main()
{
    FlowTable* sharedFlowTable = new FlowTable();
    std::thread t1( startThread1, sharedFlowTable );
    std::thread t2( startThread2, sharedFlowTable );
    //  ...
}

然后声明startThread1startThread2FlowTable*作为参数。 (这比在Java中简单得多;在Java中,您必须为每个线程定义一个类,从Runnable派生,并为每个类提供一个构造函数,该构造函数接受FlowTable并复制它成为一个成员变量,以便run函数可以找到它。)

编辑:

当然,如果sharedFlowTable指向的值确实是FlowTable,并且不涉及继承和工厂函数,则可以在main中将其设为局部变量,而不是指针,并将&sharedFlowTable传递给线程。这将更简单,在C ++中更惯用。 (我要感谢@ 5gon12eder指出这一点。令人尴尬的是,因为我通常是反对动态分配的人,除非有必要。)