2016-03-24 16 views
1
class Customer{ 
public: 
     Customer(){}; 
     Customer(int i) 
     {id=i;} 
     ~Customer(){...}; 
     static void* run(void* arg) 
     { 
     //code for execution 
     return NULL; 
     } 
private: 
static int id; 
} 

int main(void) 
{ 
    int index; 
    int status; 
    //Create Customer Threads 
    pthread_t Customer_Threads[50]; 
    Customer *Customers; 
    Customers=new Customer[50]; 
    // create 50 Customer threads 
    for (index = 0; index < 50; index++) { 
     Customers[index]=*new Customer(index); 
     status = pthread_create (&Customer_Threads[index], NULL, Customers[index].run, NULL); 
     assert(0 ==status); 
    } 
} 

Sorum, hatası ' ve' tanımsız referansı 'Müşteri :: ~ A() tanımsız başvuru' hakkında açılır edilir Müşteri :: A() ''.pthread_create çağrı işlevi

Bir sınıf müşteri nesnesi dizisi oluşturmak ve sınıf işlevindeki çalıştırma işlevini yürütmek için multi_thread öğesini kullanmak istiyorum, bu hataların nasıl ele alınacağını bilmiyorum. Teşekkürler.

Xcode'ta C++ kullanın ve linux derleyin.

----------------- Güncelleme -------------------

Şimdi ben hala bir yüz hata 'undefined reference' Müşteri :: kimlik ''.

Neden olmadığından emin değilsiniz.

+1

gibi görünecektir. Kurucuları ve yıkıcıyı bildirirsiniz, ancak * tanımlamalar * (örn. Yapıcılar ve yıkıcıların uygulamaları? –

+0

Ayrıca bu ifade 'Müşteriler [index] = * yeni Müşteri (index)' size bir bellek sızıntısı verecektir. Java'dan farklı olarak, nesne örnekleri oluşturmak için 'new' kullanmanız gerekmez. Sadece "Müşteri (dizin)" yapmak bunu yapıyor, bu yüzden "Müşteriler [index] = Müşteri (endeks)" olarak değiştirin. –

+1

Bu, ** bu ** kodu derlenirken alınan hatayı hayal etmek anlamına gelmez. 'Müşteri', eğer kurucular ve bir yıkıcı varsa, onları 'A' değil, 'Müşteri' (ve 'Müşteri') olarak adlandırırlardı. Sınıf tanımınızdan sonra da feshediyorsunuz; Derleyici, bir bağlantı aşamasına ulaşmadan çok önce bu şeylerle ilgili olarak cennete şikâyet etmelidir. – WhozCraig

cevap

0

C dizileri yerine stl kabı kullanmanızı öneririm.

status = pthread_create(..., &Customers::run, ...); 

: Statik işleve işaretçi geçmesi gerek pthread statik işlevi geçirmeden için

status = pthread_create (..., Customers[index].run, ...); 

: Henüz böyle bu işlevi geçmesi gerekir böylece

Müşteri :: işletilen statik fonksiyonudur Tamam, işlevi geçiyoruz ama aynı zamanda beton Müşteri nesnesini

Kodun son sürümü,

void *Customer::run(void *arg) 
{ 
    Customer *this_ = (Customer *)arg; 
    // Do something 
} 

std::list<pthread_t> pthreads(50); 
std::list<Customer *> Customers(50); 

for (size_t i = 0; i < pthreads.size(); ++i) 
{ 
    Customers[i] = new Customer(); 
    status = pthread_create(&pthreads[i], &Customer::run, (void *)Customers[i]); 
    ... 
} 

for (size_t i = 0; i < pthreads.size(); ++i) 
{ 
    pthread_join(pthreads[i]); // block until thread end 
    delete Customers[i]; // free mem 
} 
+0

Teşekkürler, yönteminizi kullanmaya çalıştım, ancak yine de aşağıdaki gibi hata buldum: 'Müşteri :: Müşteri()' işlevinde: 'Müşteri :: kimliği' için tanımlanmamış başvuru, sanırım benim sınıf uygulamalamam olabilirim ' Doğru, bu sınıf uygulaması hakkında bana bir ipucu verebilir misiniz? – Mantrapps

+0

İstemci :: id'nin iç dosyada başlatılmamış olduğunu sanıyorum, I.e int müşteri ekledim :: Id = 1; cpp dosyası içinde sınıf bildiriminden sonra –

+0

Evet, düzeltildi. Teşekkürler – Mantrapps

İlgili konular