2013-02-19 2 views
0

J'utilisais des sémaphores de boost dans RHEL et actuellement je porte le code à solaris 10. J'ai rencontré un problème étrange que les sémaphores de boost ne fonctionnent pas correctement.boost sémaphores de la bibliothèque sur solaris

J'ai créé des sémaphores anonymes en utilisant l'exemple website de boost. Les sémaphores fonctionnent bien sur la machine de développement mais ne fonctionnent pas sur la machine de test. Un processus est bloqué à l'état d'attente après l'envoi à l'autre mais l'autre processus n'est pas sorti de l'état d'attente.

Voici ma sémaphores décélération:

... 
//in global space 
struct iSema 
{ 
     interprocess_semaphore ASync; 
     interprocess_semaphore BSync; 
     iSema() 
     :ASync(0), BSync(0) 
     {} 
}*m_Sema; 
mapped_region SemaRegion; 
#define SHM_SIZE 512 
... 

... 
//in main process 1 
     try 
     { 
       std::size_t ShmSize = SHM_SIZE; 
       shared_memory_object::remove("xyz"); //remove previous instance 
       shared_memory_object shm(create_only, "xyz", read_write); //create new 
       shm.truncate(sizeof(struct iSema)); 
       mapped_region region(shm, read_write); //get into local scope region 
       SemaRegion.swap(region); //swap with global scope region 
       m_Sema = new (SemaRegion.get_address()) (struct iSema); //map it 
     } 
     catch(exception& e) 
     {//logging 
     } 
... 
//Do some thing 
m_Sema->ASync.post(); 
m_Sema->BSync.wait();//stuck at this place 
... 
... 
//in main second process 
    try 
    { 
     std::size_t ShmSize = SHM_SIZE; 
     shared_memory_object shm(open_only, "xyz", read_write); 
     shm.truncate(sizeof(struct iSema)); 
     mapped_region region(shm, read_write); 
     SemaRegion.swap(region); 
     m_Sema = new (SemaRegion.get_address()) (struct iSema); 
    } 
    catch(exception& e) 
    { 
//logging 
    } 
m_Sema->ASync.wait(); 
m_Sema->BSync.post(); 
... 

System Info:

10 solaris

gcc 4.1.2 auto construire avec binutils 2.18

boost 1,47

sparc architecture

+0

Quelle version de Boost? Avez-vous les mêmes versions sur les deux machines? –

+0

J'utilise le boost 1.47 – bikram990

+0

Avec un petit coup et une traînée j'ai eu que si je poste deux fois dans le processus 1 alors cela fonctionne bien sur la machine de test, mais il échoue toujours sur la machine de dev. Mais il échoue encore parfois sur la machine de test. – bikram990

Répondre

1

Ceci était entièrement lié à l'utilisation des sémaphores et de la mise en œuvre de solaris. Dans Mon cas, le processus 1 était en cours de publication avant que le processus 2 puisse ouvrir la mémoire partagée pour les sémaphores. Par conséquent le processus deux n'obtenait aucun message du processus 1. J'ai obtenu le code ci-dessus fonctionnant avec les changements mineurs énumérés ci-dessous:

... 
//in global space 
struct iSema 
{ 
     interprocess_semaphore ASync; 
     interprocess_semaphore BSync; 
     interprocess_semaphore CSync; 
     iSema() 
     :ASync(0), BSync(0), CSync(0) 
     {} 
}*m_Sema; 
mapped_region SemaRegion; 
#define SHM_SIZE 512 
... 

... 
//in main process 1 
     try 
     { 
       std::size_t ShmSize = SHM_SIZE; 
       shared_memory_object::remove("xyz"); //remove previous instance 
       shared_memory_object shm(create_only, "xyz", read_write); //create new 
       shm.truncate(sizeof(struct iSema)); 
       mapped_region region(shm, read_write); //get into local scope region 
       SemaRegion.swap(region); //swap with global scope region 
       m_Sema = new (SemaRegion.get_address()) (struct iSema); //map it 
     } 
     catch(exception& e) 
     {//logging 
     } 
... 
//Do some thing 
m_Sema->CSync.wait(); 
m_Sema->ASync.post(); 
m_Sema->BSync.wait(); 
... 
... 
//in main second process 
    try 
    { 
     std::size_t ShmSize = SHM_SIZE; 
     shared_memory_object shm(open_only, "xyz", read_write); 
     shm.truncate(sizeof(struct iSema)); 
     mapped_region region(shm, read_write); 
     SemaRegion.swap(region); 
     m_Sema = new (SemaRegion.get_address()) (struct iSema); 
    } 
    catch(exception& e) 
    { 
//logging 
    } 
m_Sema->CSync.post(); 
m_Sema->ASync.wait(); 
m_Sema->BSync.post(); 
... 
Questions connexes