2012-02-29 19 views
5

Ho un programma che esegue due diverse operazioni e mi piacerebbe condividere le variabili tra di loro.C++, come condividere i dati tra processi o thread

Al momento, sto utilizzando thread anziché processi fork ma sto riscontrando problemi nella condivisione di variabili anche se li ho dichiarati volatili.

ho cercato con boost fare:

boost::thread collisions_thread2(boost::bind(function_thread2); 

dichiarando le variabili condivise come volatile, ma sembra che la funzione function_thread2() non è in grado di vedere i cambiamenti sulle variabili condivise.

Quello che mi piacerebbe fare è qualcosa di simile:

thread1: 

while(true){ 
//..do somet stuff 
check variable1 
} 

thread2: 

while(true){ 
do some other stuff 
check and write on variable1 
} 

Mi potete suggerire un tutorial o un metodo per condividere facilmente variabile tra i thread? La libreria boost può essere utile in questo caso? Pensi che sia meglio usare fork()?

So che devo usare il mutex per evitare situazioni critiche, ma non l'ho mai usato.

+0

Verificare se [questa domanda] (http://stackoverflow.com/questions/118199/c-thread-shared-data) aiuta. E alla fine [Boost Thread Synchronization] (http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html) – jweyrich

+0

volatile non ha nulla a che fare con i thread –

+0

Non hai nemmeno bisogno di ' volatile' per condividere variabili. Le variabili globali sono condivise per impostazione predefinita. Ma è una cosa brutta in quanto rende facile la creazione di gare di dati. Quando hai gare di dati, non puoi aspettarti che il tuo programma si comporti ragionevolmente, quindi probabilmente ti imbatterai in una varietà di questo. Dovrai pubblicare più del tuo codice reale per ottenere aiuto nella diagnosi delle gare di dati. – bames53

risposta

2

Se è possibile utilizzare boost, è possibile utilizzare boost::mutex.

// mtx should be shared for all of threads. 
boost::mutex mtx; 

// code below for each thread 
{ 
    boost::mutex::scoped_lock lk(mtx); 
    // do something 
} 
2

Se si utilizzano le librerie di posix posix (che consiglio), utilizzare pthread_mutex_t.

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 

Poi, in ogni thread in cui si desidera sincronizzare l'accesso ai dati:

pthread_mutex_lock(&lock); 
//access the data 
pthread_mutex_unlock(&lock); 
1

qualsiasi tipo di blocco mutex o sblocco funzionerebbe. Per quanto riguarda la tua domanda su volatile, questa parola chiave è una buona pratica specialmente nei programmi multi-threaded come il tuo. Ma non influisce sul modo in cui si blocca e si sblocca. volatile dice semplicemente al compilatore di non ottimizzare una variabile per es. inserendolo in un registro. Ecco una spiegazione molto buona:

http://drdobbs.com/cpp/184403766

Problemi correlati