2012-02-29 23 views
5

Mam program, który uruchamia dwie różne operacje i chciałbym udostępniać zmienne między nimi.C++, jak udostępniać dane między procesami lub wątkami

W tej chwili używam wątków zamiast procesów fork, ale mam problemy z dzieleniem zmiennych, nawet jeśli zadeklarowałem je jako niestabilne.

Próbowałem z doładowania robi:

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

deklarując wspólne zmienne jako lotny, ale wydaje się, że funkcja function_thread2() nie jest w stanie zobaczyć zmiany na wspólnych zmiennych.

Co chciałbym zrobić coś takiego jak:

thread1: 

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

thread2: 

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

Możecie polecić mi tutorial lub metodę łatwo podzielić zmienną pomiędzy wątkami? Może być przydatna w tym przypadku biblioteka wspomagania? Czy uważasz, że lepiej jest użyć fork()?

Wiem, że muszę używać muteksa, aby uniknąć sytuacji krytycznych, ale nigdy go nie użyłem.

+0

Sprawdź, czy [to pytanie] (http://stackoverflow.com/questions/118199/c-thread-shared-data) pomaga. I ostatecznie [Boost Thread Synchronization] (http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html) – jweyrich

+0

volatile nie ma nic wspólnego z wątkami –

+0

Nawet nie potrzebujesz '. volatile' udostępniać zmienne. Zmienne globalne są domyślnie udostępniane. Jest to jednak coś złego, ponieważ ułatwia tworzenie wyścigów danych. Kiedy masz wyścigi danych, nie możesz oczekiwać, że twój program zachowa się rozsądnie, więc prawdopodobnie masz do czynienia z pewną różnorodnością. Będziesz musiał opublikować więcej swojego prawdziwego kodu, aby uzyskać pomoc w diagnozowaniu wyścigów danych. – bames53

Odpowiedz

2

Jeśli można użyć boost, można użyć 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

Jeśli używasz biblioteki posix threading (co polecam), użyj pthread_mutex_t.

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 

Następnie, w każdym wątku, gdy chcesz synchronizować dostęp do danych:

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

wszelkiego rodzaju blokady mutex lub odblokować będzie działać. Jeśli chodzi o twoje pytanie dotyczące zmienności, słowo kluczowe jest dobrą praktyką, szczególnie w programach wielowątkowych, takich jak twoje. Ale nie ma to wpływu na sposób blokowania i odblokowywania. volatile po prostu mówi kompilatorowi, aby nie optymalizował zmiennej np. poprzez umieszczenie go w rejestrze. Oto bardzo dobre wyjaśnienie:

http://drdobbs.com/cpp/184403766

Powiązane problemy