-1

メインによって呼び出される関数の 1 つからスレッドを生成しています。このスレッドの開始ルーチンは、まったく別の別のクラスの関数です。そのクラスにアクセスするために、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;
}

コード全体をベンチマーク コードとして投稿することはできず、非常に長く詳細です。助けてください。

4

1 に答える 1

0

スレッドからメンバー関数を呼び出したいという質問を正しく理解していれば、c++11を使用している場合に実行できます。

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

これにより、スレッドが作成されthmy_mem_funcmy_object

編集

std::thread th(&my_writer::write_some, &writer_object, data);
th.join();
于 2012-05-04T14:52:36.193 に答える