2015-02-26 3 views
-2

Я хочу использовать один объект в нескольких потоках, используя 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 ,

в основном() моего стартера Я вызываю новый FlowTable(), создаю потоковые объекты и передаю FlowTable * с помощью setter. Но, в конце концов, похоже, что эти два потока работают с разными объектами 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

вам нужно использовать разделяемую память или каналы –

+1

Это не так. 'std :: thread' все еще легкие процессы, разделяющие одно и то же пространство памяти. В этом случае вам нужно синхронизировать весь доступ к «FlowTable». –

+2

Информация, предоставленная вами, кажется недостаточной, чтобы указать, где ваша проблема. Если вы передаете двум потокам указатель на один и тот же объект, то они могут поделиться им (надежда на правильную синхронизацию). Кстати, что делает 'start()' do? это ваша долговременная задача? – 5gon12eder

ответ

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 функция может найти)

EDIT:.

конечно, если значение указывает sharedFlowTable действительно FlowTable, а не наследование и фабричные функции не задействованы, вы можете просто сделать это локальная переменная main, а не указатель, и передать &sharedFlowTable в темы. Это было бы еще проще и более идиоматично в C++. (И я должен поблагодарить @ 5gon12eder за это. Смущающе, потому что я обычно спорю против динамического распределения, если это не нужно.)

+0

OP, похоже, имеет фон Java, но C++-метод должен был бы использовать 'FlowTable ft {}; std :: thread t1 {startThread1, &ft}; std :: thread t2 {startThread2, &ft}; ... '. – 5gon12eder

+0

@ 5gon12eder Да, и я обновился, чтобы отразить это (основываясь на ваших комментариях к вопросу --- спасибо). С другой стороны, возможно, что его пример упрощен и что в фактическом коде «FlowTable» является абстрактным, и он вызывает фабричную функцию для его получения. (Из его описания я не думаю, что это было бы уместно, если бы я правильно поняла семантику. Но, конечно, есть случаи, когда это было бы уместно.) –

+1

Конечно, но если Java-программисты изучают C++, 99% времени, им действительно не нужно использовать 'new'. – 5gon12eder

Смежные вопросы