示例代码:

//! 多线程多任务队列
void test_2()
{
    thread_t thread;
    task_queue_t tq[3];

    for (unsigned int i = 0; i < sizeof(tq)/sizeof(task_queue_t); ++i)
    {
        thread.create_thread(task_binder_t::gen(&task_queue_t::run, &(tq[i])), 1);
    }

    foo_t foo;
    cout << "helloworld, thread id:"<< ::pthread_self() << endl;
    for (unsigned int j = 0; j < 100; ++j)
    {
        tq[j % (sizeof(tq)/sizeof(task_queue_t))].produce(task_binder_t::gen(&foo_t::print, &foo, j));
        sleep(1);
    }
    thread.join();
}

  多线程单任务队列方式

  有时候可能并不需要逻辑操作的完全有序,而是要求操作尽可能快的执行,只要有空闲线程,任务投递到空闲线程立刻执行。如果时序不影响结果,这种模式会更有效率,下面几种情况可能用到这种模式:

  ● 比如social game中的好友是从platform的api获取的,需要http协议通讯,若采用curl等http库同步通讯时,会阻塞线程,这是可以使用多线程单队列方式,请求投递到任务队列后,只要有空闲线程立马执行,用户A虽然比用户B先到达任务队列,但是并不能保证A比B一定先获取到好友列表,如果A有2k好友,而B只有两个呢,当然有可能B请求更快。

//! 多线程单任务队列
void test_3()
{
    thread_t thread;
    task_queue_t tq;

    thread.create_thread(task_binder_t::gen(&task_queue_t::run, &tq), 3);

    foo_t foo;
    cout << "helloworld, thread id:"<< ::pthread_self() << endl;
    for (unsigned int j = 0; j < 100; ++j)
    {
        tq.produce(task_binder_t::gen(&foo_t::print, &foo, j));
        sleep(1);
    }
    thread.join();
}

  任务队列的高阶用法

  异步回调

  任务队列的模式中列举的例子都是线程间单项通讯,线程A将请求投递给了B,但B执行完毕后A并没有检测结果。实际中往往都是需要将执行结果进行额外处理或者投递到另外任务队列。异步回调可以很好的解决这个问题,原理是投递任务时,同时包含检查任务执行结果的函数。示例代码:

//! 异步回调
void test_4()
{
    thread_t thread;
    task_queue_t tq;

    thread.create_thread(task_binder_t::gen(&task_queue_t::run, &tq), 1);

    foo_t foo;
    cout << "helloworld, thread id:"<< ::pthread_self() << endl;
    for (unsigned int j = 0; j < 100; ++j)
    {
        tq.produce(task_binder_t::gen(&foo_t::print_callback, &foo, j, &foo_t::check));
        sleep(1);
    }
    thread.join();
}