2016-12-01 8 views
0

У меня есть следующий код, который получает ошибку сбрасывания ядра. Затем каждый экземпляр C создает собственный поток. Я думаю, что что-то не так со статической функцией и аргументом класса «count». Когда я закомментировать код, который печатает его, никакой ошибки не происходит ..ошибка сегментации при использовании pthreads в классе

#include <iostream> 
    #include <pthread.h> 
    using namespace std; 

    class C { 
     public: 
     int count; 
     C(int c_): count(c_){} 
    public: 
     void *hello(void) 
     { 
      std::cout << "Hello, world!" <<std::endl; 
      std::cout<<count; // bug here!!! 
      return 0; 
     } 

     static void *hello_helper(void *context) 
     { 
      return ((C *)context)->hello(); 
     } 

     void run() { 

      pthread_t t; 
      pthread_create(&t, NULL, &C::hello_helper, NULL); 
     } 

    }; 

    int main() { 

    C c(2); 
    c.run(); 

    C c2(4); 
    c2.run(); 

    while(true); 

    return 0; 
    } 

ответ

1

Решил написать ответ. Вы звонили hello_helper с context из NULL на основе того, как вы создавали свою нить. C++ полностью позволяет вам вызывать функции-члены в нулевых указателях, и никаких ошибок не возникает, если элемент элемента не доступен.

В вашем случае, добавив строку для печати count. Теперь вы получаете доступ к переменной-члену с нулевым указателем, который является большим нет-нет.

Вот пример того, что вы деться с:

#include <iostream> 
class Rebel 
{ 
    public: 
    void speak() 
    { 
     std::cout << "I DO WHAT I WANT!" << std::endl;   
    }  
}; 
int main() 
{ 
    void * bad_bad_ptr = NULL; 
    ((Rebel*)bad_bad_ptr)->speak(); 
} 

Выход:

I DO WHAT I WANT!

Изменяя свой pthread_create вызов пройти this указатель (т.е. pthread_create(&t, NULL, &C::hello_helper, this);, теперь у вас есть действительный экземпляр для доступа к переменным-членам.

+0

mascoj, вы правы, этот аргумент является указателем на экземпляр класса, я был неаккуратным в этой точке. , – eral

-1

Я решил проблему, передавая этот указатель вместо от NULL при создании темы. Я думаю, os создал тот же самый поток дважды в первом случае?

+1

Нет, вы вызывали '' '' hello_he lper'''' с контекстом '' '' NULL'''' ..... – mascoj

+0

почему это имеет значение? Когда я не печатаю счетную переменную, это нормально .. – eral

+0

Чтобы сделать этот ответ более полезным (и меньше приманки), я рекомендую добавить код, который вы изменили, что вы его изменили, и объяснить, как это решило вашу проблему. – user4581301

 Смежные вопросы

  • Нет связанных вопросов^_^