我使用C ++来实现线程类。我的代码如下所示。 我有一个关于如何访问线程数据的问题。 在Thread类中,我使用pthread_create()函数创建一个线程。然后它调用EntryPoint()函数来启动创建的线程。在Run函数中,我想访问mask变量,它总是显示段错误。 所以,我的问题是新创建的线程是否复制原始类中的数据?如何访问线程自己的数据?
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();
}
答案 0 :(得分:2)
我不熟悉您正在使用的库,但是EntryPoint如何知道pthis是指向Thread的指针?线程(this)似乎没有传递给pthread_create。
答案 1 :(得分:1)
您正在尝试编写Thread类用于教育目的,这很棒。但是,如果你不是,为什么reinvent the wheel?
答案 2 :(得分:0)
p这很可能是NULL,你应该仔细检查你是否将正确的参数传递给pthread_create。
答案 3 :(得分:0)
基本上,问题是一旦启动线程,主要退出并且本地Thread
实例超出范围。因此,因为线程对象的生命周期是由另一个线程控制的,所以你已经引入了竞争条件。
另外,我会考虑在Thread::start
创建一个帖子之后立即加入一个帖子,这有点奇怪。