Je crée des threads à partir de l'une des fonctions appelées par main. La routine de démarrage de ce thread est une fonction dans une autre classe séparée. Donc, pour avoir accès à cette classe, j'ai écrit une fonction externe "C", par laquelle je suis capable d'appeler la routine de démarrage. Mais le problème est qu'après avoir accédé à la routine de démarrage, le thread ne peut pas accéder à la valeur des variables membres définie par le constructeur de la classe.plusieurs threads-impossible d'accéder aux variables de membre de classe définies par le constructeur
Cela me semble étrange car tout est parfait quand je cours le code sans utiliser de threads. Quelqu'un peut-il me suggérer ce qui ne va pas?
Je posterai quelques détails pertinents du Code ci-dessous:
`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);
}
...
}`
// il y a une classe CFileOp qui a un certain parlementaire variables et write_block est une fonction publique de celui-ci.
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;
}
Je ne peux pas publier l'intégralité du code en tant que code de référence et est très long et détaillé. S'il vous plaît aider.
Il y a des centaines de façons de commencer les discussions et passer des paramètres à eux. Lequel as-tu utilisé? – PlasmaHH
Cette variable est-elle marquée comme volatile? –
Montrez-nous le code, s'il vous plaît. – Romain