c ++多线程

时间:2010-04-27 01:15:42

标签: c++ multithreading

我使用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();  
}

4 个答案:

答案 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创建一个帖子之后立即加入一个帖子,这有点奇怪。