2013-07-04 18 views
10

いくつかのデータメンバーを持つクラスと、これらのデータメンバーにアクセスできるプライベートクラスを定義できます。クラス内のスレッドを同じクラスの関数で作成する

次に、クラスのデータメンバーで動作するスレッドを作成するpublic関数が必要です。私はコードをコンパイルするのにいくつか問題があります。

mutexやデータ保護について心配する必要はありませんが、これは問題になることはありません。これはテスト用のコード例です。

class foo { 
    public: 
    void make_foo_func_threads(); 

    private: 
    void foo_func(); 

    char private_data; 
    std::vector<std::thread> some_threads; 
} 

void foo::foo_func() { 
    while(1) { 
     private_data = 'A'; 
    } 
} 

void foo::make_foo_func_thread() { 
    for(...) some_threads.push_back(std::thread(foo_func)); 
    for(...) some_threads.join(); 
} 

コンパイラは私にエラーを与えている:

'no matching call to std::thread::thread()'

どうやら<unresolved overloaded function type>からvoid (foo::*&&)'への引数1「は既知の変換はありません。

コンパイラとは別に、foo_funcを解決する方法を理解することができないと私は考えていません。

私は何をしようとしているのかをコンパイラに理解させるために、どうすればエラーが出るのか気にしません。間違いなく、私が書いたコードは合法ではなく、そうであれば誰かがなぜそれが私の場合であるか説明することができます。ありがとう!

答えて

11

foo_funcは、(static)メンバー関数であり、操作するインスタンスはfooである必要があります。このインスタンスは、スレッドコンストラクターに提供する必要があります。参照ページstd::thread::threadを参照すると、新しいスレッドで実行されるコードが説明されています。関連するポイントは、メンバ関数へのポインタであるfを意味するものである。

  • If f is pointer to a member function of class T , then it is called. The return value is ignored. Effectively, the following code is executed:
    • (t1.*f)(t2, ..., tN) if the type of t1 is either T , reference to T or reference to type derived from T .
    • ((*t1).*f)(t2, ..., tN) otherwise.

がので、インスタンスが必要であることは明らかです。

for(...) some_threads.push_back(std::thread(&foo::foo_func, this)); 

Simple example:へ

変更

#include <iostream> 
#include <thread> 
#include <vector> 

class foo 
{ 
public: 
    void make_foo_func_threads() 
    { 
     for (int i = 0; i < 5; ++i) 
      some_threads.push_back(std::thread(&foo::foo_func, this)); 
     for (auto& t: some_threads) t.join(); 
    } 

private: 
    void foo_func() { std::cout << "Hello\n"; } 
    std::vector<std::thread> some_threads; 
}; 

int main() 
{ 
    foo f; 
    f.make_foo_func_threads(); 
} 
+0

さて、それは素晴らしいことです!しかし、1つの問題は、私のプログラムが無限ループが走っているはずですが、メインの一番下から抜け出してしまいます。 thread.join()はスレッドが参加するのを待っているようではありません! – user3728501

+0

@EdwardBird、あなたは積み重ねられた曲がりくねったものに完全なプログラムを投稿してリンクを投稿できますか?あるいは、他の人の貢献を得るための別の質問を掲示してください(そして、この回答と、もう1つは投稿された質問に答えました)。 – hmjd

+2

おっと、私の気持ちは変わりませんでした。私はf.make_foo_func_threads()を入れませんでした。メイン!それについて申し訳ありません、それは誰もがうまくいきません! >。< – user3728501

関連する問題