2017-11-23 16 views
1

私はこのC++は同じクラス変数を共有するスレッドで作成されますか?

class ThreadPool 
{ 
public: 
    ThreadPool(); 
    ThreadPool(int total_thread); 
    ~ThreadPool(); 
    void active_pool(void); 
    void* thread_start_routine(void* run_data); 

private: 
    int total_thread_; 
    queue<TASK*> task_queue; 
    sem_t* task_queue_mutex_;//Same function as mutex semaphore in P-C problem. 
    sem_t* task_queue_full_;//Same function as full semaphore in P-C problem. 
}; 

のようなクラスを持っていると私はactive_pool関数内の複数のスレッドを作成し、各スレッドエントリー機能がthread_start_routineです。

私の質問は〜それぞれがキューtask_queueと/ポップをプッシュする必要がある場合、スレッドの作成を通じて、すべてのスレッドが同じキューを参照するか、彼らが見た各キューは単なるローカルコピーであるだろう

はありがとうということです

答えて

2

すべてのスレッドに同じキューが表示されます。それは並行プログラミングの美しさです。 (スレッドごとに別のインスタンスが必要な場合は、thread_localの記憶時間を使用できます。これはC++ 11以降でC++に新たに追加されたものです。)

通常、関連するメンバがスレッド単位で使用されるようにする必要があります。安全な方法。そのためには、原子タイプ(C++ 11のstd::atomic)と相互排除ユニット(C++ 11のstd::mutex)が使用されます。

参考文献:すべてのスレッドが同じキューを参照してくださいなぜ

http://en.cppreference.com/w/cpp/keyword/thread_local

http://en.cppreference.com/w/cpp/atomic/atomic

http://en.cppreference.com/w/cpp/thread/mutex

+0

?私はそれを得ることができません。 –

+0

@HaohaoChangスレッドは、すべて同じプロセスのアドレス空間を共有します。共有アドレス空間が必要ない場合は、スレッドを必要とせず、それぞれが独自のアドレス空間を持つプロセスを分離します。 –

関連する問題