2012-02-29 55 views
5

私は2つの異なる操作を実行するプログラムを持っており、それらの間で変数を共有したいと思います。C++、プロセスやスレッド間でデータを共有する方法

現時点では、私はフォークプロセスの代わりにスレッドを使用していますが、変数を変数として宣言しても変数の共有に問題があります。

私はやってブーストしてみました:

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

をvolatileとして共有変数を宣言することによって、function_thread2()関数は共有変数の変化を見ることができないようです。

私は何をしたいのですがのようなものです:あなたは私のチュートリアルや簡単にスレッド間で変数を共有するための方法を

thread1: 

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

thread2: 

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

を提案することはできますか? この場合、ブーストライブラリが役立つことがありますか? 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

+0

volatileはスレッドとは関係ありません –

+0

あなたは '変数を共有することができます。グローバル変数はデフォルトで共有されます。しかし、データレースを簡単に作成できるので、これは悪いことです。データレースを持っているときは、あなたのプログラムが合理的に動作するとは期待できません。データレースを診断するためのヘルプを得るには、実際のコードをもっと投稿する必要があります。 – bames53

答えて

2

// 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; 

次に、各スレッドでは、データへのアクセスを同期したい場合:あなたはboostを使用することができる場合、あなたはboost::mutexを使用することができます

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

どのような種類のmutexロックまたはロック解除も機能します。限り、あなたの質問は、揮発性に行く、このキーワードは、特にあなたのようなマルチスレッドプログラムの良い練習です。しかし、それはあなたのロックとロック解除の方法には影響しません。 volatileは、単に変数を最適化しないようにコンパイラに指示します。それをレジスタに入れることによって。ここでは非常に良い説明です:

http://drdobbs.com/cpp/184403766

関連する問題