SORU
20 Mayıs 2012, Pazar


Üye işlevi ile iş parçacığı başlatmak

Herhangi bir argüman ve döndürür void alır std::thread Bir üye ile bir işlev oluşturmak için çalışıyorum. Çalışan herhangi bir sözdizimi - ne olursa olsun şikayet derleyici çözemiyorum. test() yürütür std::thread döndürür spawn() uygulamak için doğru yolu nedir?

#include <thread>
class blub {
  void test() {
  }
public:
  std::thread spawn() {
    return { test };
  }
};

CEVAP
20 Mayıs 2012, Pazar


#include <thread>
#include <iostream>

class bar {
public:
  void foo() {
    std::cout << "hello from member function" << std::endl;
  }
};

int main()
{
  std::thread t(&bar::foo, bar());
  t.join();
}

EDİT: Senin düzen muhasebe, böyle yapmak zorundasın:

  std::thread spawn() {
    return std::thread(&blub::test, this);
  }

GÜNCELLEME:Bazı noktaları açıklamak istiyorum, bazıları da yorum tartışıldı.

Sözdizimi yukarıda açıklanan ÇAĞIRMAK tanımı (§20.8.2.1): bölgesidir

Aşağıdaki gibi ÇAĞIRMAK (t1, t2,..., tN f) tanımlayın

  • (t1.*f) f Bir üye işlev işaretçisi(t2, ..., tN) bir sınıfın T ve t1 T türü bir nesne ya da bir nesneye bir referanstır bir tür T türetilmiş bir nesneye T türü veya bir başvuru;
  • ((*t1).*f) f Bir üye işlev işaretçisi(t2, ..., tN) bir sınıfın T ve t1 türleri önceki tarif değil öğe;
  • t1.*N == 1 ve f sınıfı T ve t 1 veri üyesi için bir işaretçi olduğunda f Tipi T veya bir nesnedir
    türünde bir nesne başvurusu veya bir nesne için bir başvuru
    yazın T türetilmiştir;
  • (*t1).*f N == 1 ve f sınıfı bir T veri üyesi için bir işaretçi ve t 1 türleri önceki öğe ile tarif değil;
  • tüm diğer durumlarda f(t1, t2, ..., tN).

İşaret etmek istediğim başka bir genel aslında varsayılan iş parçacığı yapıcı tüm eleştirileri geçti kopyalayın. Bunun nedeni, bağımsız iş parçasıyla daha uzun yaşamak için, bağımsız garanti kopyalama gerekebilir. Eğer gerçekten bir referans geçirmek istiyorsanız, bunun yerine, std::reference_wrapper std::ref tarafından oluşturulan kullanabilirsiniz.

std::thread (foo, std::ref(arg1));

Bunu yaparak, argümanları hala bu konu onları çalıştığında var garantileyecek bir bakacaksın umut verici.


Her şeyi yukarıda da std::async std::bind uygulanabilir unutmayın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • joshsnice

    joshsnice

    28 Kasım 2006
  • Migs351

    Migs351

    3 HAZİRAN 2007
  • TheFlashCentre

    TheFlashCent

    22 Mayıs 2008