#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();
}
EDIT: Düzenleme muhasebe, böyle yapmak zorunda:
std::thread spawn() {
return std::thread(&blub::test, this);
}
GÜNCELLEME: Bazı noktaları daha fazla açıklamak istiyorum, bazıları da yorumlarda tartışıldı.
Yukarıda açıklanan sözdizimi INVOKE tanımı (§20.8.2.1) açısından tanımlanmıştır:
INVOKE'u (f, t1, t2, ..., tN) aşağıdaki gibi tanımlayın:
- (t1. * f) (t2, ..., tN) f, T sınıfının üye işlevinin bir göstergesidir ve t1, T türündeki bir nesne veya T türündeki bir nesneye yapılan başvuru veya T'den türetilmiş tipte bir nesne;
- ((* t1). * f) (t2, ..., tN) f, T sınıfının üye işlevinin bir göstergesiyse ve t1, önceki öğede açıklanan türlerden biri değilse;
- t1. * f, N == 1 ve f, T sınıfının üye verilerine işaretçi olduğunda ve t 1, T türündeki
bir nesne veya T türündeki bir nesneye yapılan başvuru veya
türetilmiş türden bir nesneye yapılan başvurudır T;
- (* t1). * f, N == 1 ve f, T sınıfının üye verilerine işaretçi olduğunda ve t 1, önceki öğede açıklanan tiplerden biri değildir;
- f (t1, t2, ..., tN) diğer tüm durumlarda.
Ben işaret etmek istiyorum başka bir genel gerçeği varsayılan olarak iş parçacığı yapıcı kendisine geçirilen tüm bağımsız değişkenleri kopyalayacak olmasıdır. Bunun nedeni, argümanların çağıran evreyi geçmesi gerekebileceğidir, argümanların kopyalanması bunu garanti eder. Bunun yerine, gerçekten bir referans iletmek istiyorsanız, std::reference_wrapper
tarafından oluşturulmuş bir kullanabilirsiniz std::ref
.
std::thread (foo, std::ref(arg1));
Bunu yaparak, iş parçacığı üzerinde çalıştığında argümanların hala var olacağını garanti altına alacağınıza söz veriyorsunuz.
Yukarıda belirtilen her şeyin de tatbik edilebileceği Not std::async
ve std::bind
.