0

Sam Miller に返信していただきありがとうございます。ただし、Windows に実装する必要があります。

o が書いたこの例を見てください:

boost::mutex mut;
boost::condition_variable cond;

boost::asio::io_service io_service;

boost::asio::deadline_timer t(io_service);

void test_func()
{
    boost::mutex::scoped_lock lk(mut);
    cond.notify_all();
}

void cancel_test_func()
{
    boost::unique_lock< boost::mutex > lk(mut);
    auto canceled_timers = t.cancel();
    cond.wait(lk);
    printf("Canceled...%u.", canceled_timers);
}

int main(int argc, char* argv[])
{
  try
  {
    t.expires_from_now(boost::posix_time::seconds(5));
    t.async_wait(boost::bind(&test_func));

    io_service.post(boost::bind(cancel_test_func));

    boost::thread_group tg;
    tg.create_thread( boost::bind(&boost::asio::io_service::run, &io_service) );
    //tg.create_thread( boost::bind(&boost::asio::io_service::run, &io_service) );

    getchar();
  }
  catch (std::exception& e)
  {
    std::cerr << "Exception: " << e.what() << "\n";
  }

  return 0;
}

この例を機能させる (タイマーをキャンセルする) には、2 番目のスレッド作成のコメントを解除する必要があります。スレッドが 1 つしかないため、通知を受け取ることはありません。問題は、この動作は正常ですか?

4

1 に答える 1

0

条件変数は同期の概念であり、io_service. Linux で非同期イベントが必要な場合は、セマフォ セマンティクスのeventfd(2)withフラグを参照してください。EFD_SEMAPHORE他のプラットフォームに類似のインターフェースがあるかどうかはわかりません

于 2013-07-18T20:22:18.860 に答える