0

RHELでブーストセマフォを使用していて、現在コードをsolaris10に移植しています。ブーストセマフォが正しく機能しないという奇妙な問題が発生しました。

Boostのウェブサイトの例を使用して匿名のセマフォを作成しました。セマフォは開発マシンでは正常に動作しますが、テストマシンでは動作しません。一方のプロセスは、他のプロセスにポストした後、待機状態でスタックしていますが、もう一方のプロセスは待機状態から抜け出していません。

これが私のセマフォの減速です:

...
//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();
...

システム情報:

ソラリス10

gcc:4.1.2binutils2.18を使用したセルフビルド

ブースト1.47

sparcアーキテクチャ

4

1 に答える 1

1

これは、セマフォの使用とソラリスの実装に完全に関連していました。私の場合、プロセス1は、プロセス2がセマフォの共有メモリを開く前に投稿していました。したがって、プロセス2はプロセス1から投稿を取得していませんでした。上記のコードは、以下に示す小さな変更で機能しました。

...
//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();
...
于 2013-02-22T12:47:03.023 に答える