2012-02-29 107 views
5

我有一個運行兩個不同操作的程序,我想在它們之間共享變量。C++,如何在進程或線程之間共享數據

目前,我使用線程而不是fork進程,但即使我將它們聲明爲volatile,我在共享變量時也遇到了問題。

我試着用升壓做:

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

通過聲明的共享變量波動,但似乎function_thread2()函數是無法看到的共享變量的變化。

我希望做的是一樣的東西:

thread1: 

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

thread2: 

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

您能否提供我一個教程或在線程之間輕鬆共享變量的方法? 可能是boost庫在這種情況下可能有用嗎? 你認爲使用fork()更好嗎?

我知道我必須使用互斥鎖才能避免危急情況,但我從來沒有使用它。

+0

檢查[這個問題](http://stackoverflow.com/questions/118199/c-thread-shared-data)幫助。最終[Boost Thread Synchronization](http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html) – jweyrich 2012-02-29 19:11:27

+0

volatile與線程無關 – 2012-02-29 19:12:04

+0

你甚至不需要' volatile「來分享變量。全局變量默認共享。但這是一件壞事,因爲它使創建數據競賽變得容易。當你有數據競賽時,你不能指望你的程序行爲合理,所以你可能會遇到一些這樣的情況。你需要發佈更多的真實代碼來獲取診斷數據競賽的幫助。 – bames53 2012-02-29 19:16:39

回答

2

如果你可以使用boost,您可以使用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

如果使用posix線程庫(我推薦),然後使用pthread_mutex_t。

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 

然後,在每一個線程,當你想訪問數據同步:

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

任何類型的互斥鎖或解鎖將工作。就你的volatile問題而言,這個關鍵字是一個很好的習慣,特別是在像你這樣的多線程程序中。但它不會影響您鎖定和解鎖的方式。易失性簡單地告訴編譯器不要優化例如把它放在一個寄存器裏。這裏有一個很好的解釋:

http://drdobbs.com/cpp/184403766