多个线程 - 无法访问由构造函数设置的类成员变量

时间:2012-05-04 13:50:13

标签: c++

我从main调用的一个函数中生成线程。 该线程的启动例程是另一个单独的类中的函数。因此,为了访问该类,我编写了一个extern“C”函数,通过它我可以调用启动例程。 但问题是,在进入启动例程后,线程无法访问由类的构造函数设置的成员变量值。

这对我来说很奇怪,因为当我在不使用线程的情况下运行代码时,一切都很完美。 有人可以告诉我会出现什么问题吗?

我在下面发布一些相关的代码详情:

`extern“C”{

void* run(void* arg)
{
    CFileOp* trans = static_cast<CFileOp*>(arg);
    trans->write_block(arg);
    return 0;
}

}

int
TestFileOps(int file_size, CGlobalItems &globals){
...

for(i = 0; i < num_chunks; i++)
{
pthread_create( &thread_id[i], NULL, run, buf);
}

...
}`

//有一个类CFileOp,它有一些私有成员变量,write_block是它的公共函数。

void* CFileOp::write_block(PVOID buf)
{
int rc = my_write(78, buf, m_chunk_size);
 if(rc != m_chunk_size)
 {
   fprintf(stderr, "Can't write block; rc=%d, buf=%p, chunk_size=%d\n", rc, buf, m_chunk_size);
    pthread_exit((void *)-1);return 0;;
  }
m_cur_pos++;
fprintf(stderr,"m_cur_pos: %d   m_chunks_per_file: %d\t",m_cur_pos,m_chunks_per_file);
  if(m_cur_pos >= m_chunks_per_file)                                                    
  {
   if(seek(0, SEEK_CUR) == -1)
    pthread_exit((void *)-1);return 0;// return -1;
 }
pthread_exit((void *)rc);
return 0;
}

我不能将整个代码作为基准代码发布,并且非常详细。 请帮忙。

1 个答案:

答案 0 :(得分:0)

如果我正确地理解了这个问题,你想从一个线程中调用一个成员函数,你可以这样做,如果你有c ++ 11

 std::thread th(&my_class::my_mem_func, &my_object);

这将创建一个帖子th并执行my_mem_func的{​​{1}}

修改

my_object