2010-04-27 5 views
3

Я использую C++ для реализации класса потоков. Мой код показывает следующее. У меня проблема с доступом к данным потоков. В классе Thread я создаю поток, использующий функцию pthread_create(). затем он вызывает функцию EntryPoint(), чтобы начать созданный поток. В функции «Выполнить» я хочу получить доступ к переменной маски, она всегда показывает ошибку сегмента. Итак, мой вопрос в том, копирует ли новый созданный поток данные в исходном классе? Как получить доступ к собственным данным потока?C++ multithread

class Thread { 
public: 
    int mask; 
    pthread_t thread; 

    Thread(int); 
    void start(); 
    static void * EntryPoint (void *); 
    void Run(); 
}; 

Thread::Thread(int a) { 
    mask =a; 
} 

void Thread::Run() { 

    cout<<"thread begin to run" <<endl; 
    cout << mask <<endl;  // it always show segmentfault here 
} 

void * Thread::EntryPoint(void * pthis) { 
    cout << "entry" <<endl; 
    Thread *pt = (Thread *) pthis; 
    pt->Run(); 
} 

void Thread::start() { 

    pthread_create(&thread, NULL, EntryPoint, (void *)ThreadId); 
    pthread_join(thread, NULL); 
} 

int main() { 
    int input_array[8]={3,1,2,5,6,8,7,4}; 
    Thread t1(1); 
    t1.start(); 
} 

ответ

2

Я не знаком с библиотеками, которые вы используете, но как EntryPoint известно, что pthis является указателем на тему? Thread (this), похоже, не передается в pthread_create.

+0

Вы правы. Я должен передать это pthread_create(). Благодарю. – chnet

+0

Следите за временем жизни объекта. См. Мой пост ниже, иначе у вас все еще будут проблемы. ;) –

1

Замечательно, что вы пытаетесь написать класс Thread для образовательных целей. Однако, если вы этого не сделаете, почему reinvent the wheel?

+0

Да, в целях образования. Не могли бы вы дать мне несколько намеков на уже «колесо»? Я новичок в многозадачности. – chnet

+0

Boost обеспечивает отличную реализацию независимой нити, которую я связал. Если вы пытаетесь изучить многопоточность, я предлагаю использовать Boost. Это избавит вас от необходимости приступать к nitty-gritty, изучая проблемы многопоточности C++. – wheaties

0

pThis, скорее всего, NULL, вам следует дважды проверить, что вы передаете правильные аргументы pthread_create.

1

В основном проблема возникает, как только вы начинаете свой поток, основные выходы и ваш локальный Thread экземпляр выходит за рамки. Итак, поскольку время жизни вашего объекта потока контролируется другим потоком, вы уже ввели условие гонки.

Кроме того, я хотел бы присоединиться к теме сразу после того, как вы ее создали в Thread::start, чтобы быть немного странным.