私は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;
}
ベンチマークコードとしてコード全体を投稿することはできず、非常に長く詳細です。 助けてください。
スレッドを開始し、それらにパラメータを渡す方法の何百もあります。あなたはどちらを使いましたか? – PlasmaHH
その変数はvolatileとマークされていますか? –
私達にコードを教えてください。 – Romain