2013-07-04 14 views
10

Bazı veri üyelerine sahip bir sınıf tanımlayabilmek ve bu veri üyelerine özel olarak erişime sahip olan bir işlevi tanımlamak istiyorum.Aynı sınıfın işlevine sahip sınıf içi iş parçacığı oluşturma

Daha sonra, sınıfın veri üyeleri üzerinde çalışan bazı iş parçacıkları oluşturan genel bir işlev istiyorum. Kodumu derlemek için sorun yaşıyorum.

Muteks veya veri koruması konusunda endişelenmeyin, bu bir sorun olmayacaktır, çünkü bu yalnızca test için bazı örnek koddur.

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(); 
} 

derleyici bana hata veriyor:

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

Görünüşe göre orada 'dir void (foo::*&&)' için <unresolved overloaded function type> gelen argüman 1 için bilinen hiçbir dönüştürme.

Erm, evet, derleyiciden başka ne anlama geldiğini anlama konusunda hiçbir fikrim yok foo_func'un nasıl çözüleceğinin anlaşılmasında sorun var - sanırım.

Derleyiciye ne yapmaya çalıştığımı anlama konusunda nasıl yardımcı olabilirim, bu yüzden daha fazla hatayla beni rahatsız etmeyecek. Hiç şüphesiz, yazdığım kod yasal değildir ve eğer durum buysa, bunun neden böyle olduğunu açıklayabilir. Teşekkürler!

cevap

11

foo_func, (static) üyesi bir işlevdir ve üzerinde çalışmak üzere bir foo örneğine gereksinim duyar. Bu örnek, iş parçacığına sağlanmalıdır. std::thread::thread başvuru sayfasına başvurursanız, yeni thread'da hangi kodun yürütüldüğünü açıklar.

  • 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.

nedenle, örneğin gerekli olduğu açıktır: ilgili bir nokta elemanı işlevi için işaretçi olarak f ifade eder olmasıdır.

Değiştir:

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

Tamam, bu harika! Bir problem olsa da, programım sonsuz bir döngü çalışıyor olsa da, ana sayfanın altından düşer. thread.join() iş parçacığı katılmak için bekliyor gibi görünmüyor! – user3728501

+0

@EdwardBird, tüm programı yığılmış ya da benzer şekilde yığılmış ve bir bağlantı gönderebilir misiniz? Ya da daha iyisi, başkalarının katkılarını almak için başka bir soru gönderin (ve bu cevap, ve diğeri, gönderildiği gibi). – hmjd

+2

Oops, benim kötüyüm ben f.make_foo_func_threads() koymadı; ana olarak! Bunun için üzgünüm, herkese DONT PANIC iyi çalışıyor! >. < – user3728501

İlgili konular