2012-05-04 2 views
-1

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.

+2

Il y a des centaines de façons de commencer les discussions et passer des paramètres à eux. Lequel as-tu utilisé? – PlasmaHH

+0

Cette variable est-elle marquée comme volatile? –

+1

Montrez-nous le code, s'il vous plaît. – Romain

Répondre

0

Si je comprends bien la question que vous voulez appeler une fonction membre d'un fil, vous pouvez simplement faire si vous avez C++ 11

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

cela va créer un fil th et exécuter le my_mem_func de my_object

EDIT

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

Merci de votre réponse. En fait, j'utilise l'API pthread_create() pour créer un thread. Je passe la fonction suivante comme une routine de démarrage du fil qui est créé par pthread_create() extern "C" { void * run (void * arg) { CFileOp * trans = static_cast (arg); trans-> write_block (arg); return 0; Run() appelle alors la méthode write_block() qui appartient à une autre classe. Le problème est que le thread est capable d'accéder à la méthode write_block() mais n'est pas capable d'accéder aux valeurs des variables membres de cette classe. S'il vous plaît aider – sam32

+0

@ sam32 votre code postal, devez-vous utiliser pthreads, std :: threads sont conformes aux normes et multi-plateforme, je ne peux pas vraiment vous aider avec pthreads. De toute façon nous avons encore besoin de voir un exemple de code CONCISE/ – 111111

+0

J'ai posté du code dans mon article – sam32

Questions connexes