2010-07-09 84 views
1

將代碼段從Windows移植到Mac OS X後,我發現它在運行時會佔用整個CPU內核;負責調用CPU消耗的是boost :: interprocess :: interprocess_semaphore :: timed_wait。Mac OS X:升級進程間信號量timed_wait:異常CPU消耗

下面是重現此行爲的代碼部分。

#include <boost/interprocess/sync/interprocess_semaphore.hpp> 
#include <boost/interprocess/shared_memory_object.hpp> 
#include <boost/interprocess/mapped_region.hpp> 

#include <boost/thread/thread_time.hpp> 

#include <iostream> 

static bool gStopRequested(false); 

struct ShmObj 
{ 
    boost::interprocess::interprocess_semaphore mSemaphore; 
    ShmObj() : mSemaphore(0) {}; 
    ~ShmObj() {}; 
}; 

int main(char* argc, const char** argv) 
{ 
    boost::interprocess::shared_memory_object* lShmObj = NULL; 
    std::string lShmObjName("My_Boost_Interprocess_Test"); 
    boost::interprocess::mapped_region* lRegion; 
    ShmObj* lObj; 

    //Create shared segment 
    try 
    { 
     lShmObj = new boost::interprocess::shared_memory_object(boost::interprocess::create_only, lShmObjName.c_str(), boost::interprocess::read_write); 
    } 
    catch (boost::interprocess::interprocess_exception &ex) 
    { 
     if (ex.get_error_code() != boost::interprocess::already_exists_error) 
     { 
      std::cerr << "Some error" << std::endl; 
      exit(1); 
     } 
     else 
     { 
      std::cerr << "Already exists, just taking it back." << std::endl; 
      try 
      { 
       lShmObj = new boost::interprocess::shared_memory_object(boost::interprocess::open_only, lShmObjName.c_str(), boost::interprocess::read_write); 
      } 
      catch (boost::interprocess::interprocess_exception &ex2) 
      { 
       std::cerr << "D'oh !" << std::endl; 
       exit(1); 
      } 
     } 
    } 
    if (!lShmObj) 
    { 
     exit(1); 
    } 
    lShmObj->truncate(sizeof(ShmObj)); 
    lRegion = new boost::interprocess::mapped_region(*lShmObj, boost::interprocess::read_write); 
    lObj = new (lRegion->get_address()) ShmObj; 

    // The loop 
    while (!gStopRequested) 
    { 
     boost::system_time lDeadlineAbsoluteTime = boost::get_system_time() + boost::posix_time::milliseconds(500); 

     if (lObj->mSemaphore.timed_wait(lDeadlineAbsoluteTime)) 
     { 
      std::cout << "acquired !" << std::endl; 
     } 
     else 
     { 
      std::cout << "tick" << std::endl; 
     } 
    } 
} 

然後,我讀了無名信號量沒有在Mac OS X中可用的,所以我認爲這可能是因爲未命名的信號量並沒有有效地模擬......然後我嘗試了以下,unsucessfully:

#include <boost/interprocess/sync/named_semaphore.hpp> 
#include <boost/thread/thread_time.hpp> 

#include <iostream> 

static bool gStopRequested(false); 

int main(char* argc, const char** argv) 
{ 
    boost::interprocess::named_semaphore::remove("My_Boost_Interprocess_Test"); 
    boost::interprocess::named_semaphore lMySemaphore(boost::interprocess::open_or_create, "My_Boost_Interprocess_Test", 1); 

    // The loop 
    while (!gStopRequested) 
    { 
     boost::system_time lDeadlineAbsoluteTime = boost::get_system_time() + boost::posix_time::milliseconds(500); 

     if (lMySemaphore.timed_wait(lDeadlineAbsoluteTime)) 
     { 
      std::cout << "acquired !" << std::endl; 
     } 
     else 
     { 
      std::cout << "tick" << std::endl; 
     } 
    } 
} 

由於可用的Posix原語,我實際上期待在Mac OS X上有一個更好的boost :: interprocess行爲,但實際上並非如此。任何想法的決議?非常感謝。

回答