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
Quelle version de Boost? Avez-vous les mêmes versions sur les deux machines? –
J'utilise le boost 1.47 – bikram990
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