2012-05-04 6 views
-1

私はmainによって呼び出される関数の1つからスレッドを生成しています。 このスレッドの開始ルーチンは別の別のクラスの関数です。そのクラスへのアクセスを得るために、私はextern "C"関数を書いています。これによって、私は開始ルーチンを呼び出すことができます。 しかし、問題は、開始ルーチンに到達した後、スレッドはクラスのコンストラクタによって設定されたメンバ変数値にアクセスできません。複数のスレッド - コンストラクタによって設定されたクラスメンバ変数にアクセスできない

スレッドを使用せずにコードを実行しているとき、すべてが完璧なので、これは私には奇妙に思えます。 誰かが間違っていることを教えてもらえますか? {

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

}

`はextern "C"

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; 
} 

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

+2

スレッドを開始し、それらにパラメータを渡す方法の何百もあります。あなたはどちらを使いましたか? – PlasmaHH

+0

その変数はvolatileとマークされていますか? –

+1

私達にコードを教えてください。 – Romain

答えて

0

私はあなたがスレッドからメンバ関数を呼び出したい正しく質問を理解していれば、あなたがC++ 11

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

これはスレッドthを作成してのmy_mem_funcを実行しますを持っている場合、あなただけ行うことができますmy_object

EDIT

std::thread th(&my_writer::write_some, &writer_object, data); 
th.join(); 
+0

お返事ありがとうございます。 実際には、pthread_create()APIを使用してスレッドを作成しています。私はのpthread_create()によって作成されたスレッドにスタートルーチンとして次の関数を渡しています にextern "C" { void *型の実行(ボイド*引数) { CFileOp *トランス= static_castを(引数); trans-> write_block(arg); return 0; } } run()は、他のクラスに属するwrite_block()メソッドを呼び出しています。 問題は、スレッドがwrite_block()メソッドにアクセスできるが、そのクラスのメンバ変数の値にアクセスできないことです。 助けてください – sam32

+0

@ sam32あなたはコードを投稿する必要がありますか、pthreadsを使用する必要がありますか::スレッドは標準に準拠しており、クロスプラットフォームであり、私は本当にpthreadsであなたを助けることはできません。いずれにしてもCONCISEコードの例が必要です。/ – 111111

+0

私の投稿に関連するコードを投稿しました – sam32

関連する問題