C++11でGCDが使えるXDispatch

C++11でGCDが使えるってことで試してみた。でもiOSアプリでどうやって使うか馬鹿だから分かんない…。まぁしばらく待てばiOSで使う方法とかの情報とかも出てくるだろうし待っておこう…。XDispatch以外にもOpenGCDとかあるらしい。

GCDの使い方はObjective-CのGCD (Grand Central Dispatch)とほとんど変わらないです。


XDispatch 0.7.2でテキトーに

#include <iostream>
#include <xdispatch/dispatch.h>

namespace std {
  namespace tr1 {};
  using namespace tr1;
}

int main(int argc, const char * argv[])
{
  //
  // global_queue
  //
  std::string text = "FOO";
  xdispatch::queue_priority priority = xdispatch::LOW; // or DEFAULT, HIGH
  xdispatch::global_queue(priority).async([=](){
    puts(text.c_str());
  });

  //
  // dispatch_queue_create
  //   Serial Dispatch Queue しか作れない??
  //
  xdispatch::queue q1("ラベル1");
  q1.async([](){ puts("dispatch_queue_create 1"); });

  auto q2(new xdispatch::queue("ラベル2"));
  for (int i = 0; i < 100; i++)
  {
    // 0 ~ 99 まで連番で出力される
    q2->async([=](){ printf("Serial %d\n", i); });
  }

  //
  // dispatch_after
  //
  uint64_t delayTime = 3ULL * xdispatch::nsec_per_sec; // 3秒
  xdispatch::time popTime = xdispatch::as_delayed_time(delayTime, xdispatch::time_now);
  xdispatch::global_queue().after([=](){
    puts("dispatch_after");
  }, popTime);

  //
  // dispatch_once
  //
  for (int i = 0; i < 10; i++)
  {
    xdispatch::global_queue().async([](){
      static xdispatch::once once;
      once([](){ puts("dispatch_once"); });
    });
  }

  //
  // dispatch_set_target_queue
  //
  xdispatch::queue q3("label3");
  xdispatch::global_queue(xdispatch::LOW).target_queue(q3);
  q3.async([](){
    // LOWの優先順位で実行
    puts("dispatch_set_target_queue");
  });

  xdispatch::queue q4("label4");
  for (int i = 0; i < 10; i++) {
    xdispatch::queue q("");
    q4.target_queue(q);
    // これは CONCURRENT な感じで実行される - 数値が連番で並ぶとは限らない
    q.async([=](){ printf("dispatch_set_target_queue %d\n", i); });
  }
  //
  // dispatch_group
  //
  xdispatch::group group;

  // デフォルトはデフォルトのグローバルキューが使われる
  group.async([](){ puts("group a-1"); } /* , xdispatxh::global_queue() */);
  group.async([](){ puts("group a-2"); });
  group.async([](){ puts("group a-3"); });
  group.async([](){ puts("group a-4"); });
  group.async([](){ sleep(5); puts("group a-5"); });

  group.notify([](){ puts("group a-last"); });
  group.wait(/* xdispatch::time_forever */);
  puts("dispatch_group end waiting");

  //
  // dispatch_apply
  //   使用するスレッド数はObj-Cと違って2つではない
  //
  xdispatch::global_queue().apply([](size_t index){
    char text[100];
    sprintf(text, "dispatch_apply %zd\n", index);
    std::cout << text;
  }, 10);

  //
  // suspend and resume
  //
  xdispatch::queue q5("5");

  q5.suspend();

  int number = 0;
  for (int i = 0; i < 10; i++) {
    q5.async([&](){
      char text[100];
      sprintf(text, "susupend and resume %d\n", number);
      std::cout << text;
    });
  }
  number = 100;

  q5.resume();

  //
  // semaphore
  //
  xdispatch::semaphore semaphor(1);
  const char *sample = "0123456789abcdefghijklmnopqrstuvwxyz"; // 36文字
  char buffer[36 + 1];
  memset(buffer, 0, 37);

  int num = 0;
  xdispatch::global_queue().apply([&](size_t index){
    semaphor.acquire();
    buffer[num] = sample[num];
    usleep(10000);
    num++;
    semaphor.release();
  }, 36);

  // semaphoreをコメントアウトすると 36 以外が出力される
  std::cout << "buffer length = " << strlen(buffer) << std::endl;

  sleep(UINT_MAX); // sleep forever
  return 0;
}
  1. コメントはまだありません。

  1. トラックバックはまだありません。

*


Advertisement