libco的安装
可以直接从 Tencent 的 GitHub 仓库中拉取源码:
ubuntu@VM-0-2-ubuntu:~/libco$ git clone https://github.com/Tencent/libco.git
然后 转到下载的/libco
目录,执行make命令
ubuntu@VM-0-2-ubuntu:~/libco$ cd libco/
ubuntu@VM-0-2-ubuntu:~/libco/libco$ make
然后将其中的不带example的头文件拷贝到 /usr/include
路径下:
然后拉取之后,会在lib目录下有个libcolib.a 文件,拷贝到/usr/lib
下。
libco库的简单使用
我们现在使用协程来模拟一下经典线程的生产者和消费者模型:
#include <libco/co_closure.h>
#include <libco/co_comm.h>
#include <libco/co_routine.h>
#include <stdlib.h>
#include <cstdio>
#include <queue>
#include <iostream>
using namespace std;
// 资源
struct stTask_t
{
int id;
};
// 存储资源的队列
struct stEnv_t
{
stCoCond_t *cond;
queue<stTask_t *> task_queue;
};
// 生产者
void *Producer(void *args)
{
co_enable_hook_sys();
stEnv_t *env = (stEnv_t *)args;
int id = 0;
while (true)
{
stTask_t *task = (stTask_t *)calloc(1, sizeof(stTask_t));
task->id = id++;
env->task_queue.push(task);
cout << "produce task " << task->id << endl;
co_cond_signal(env->cond);
poll(NULL, 0, 1000);
}
return NULL;
}
// 消费者
void *Consumer(void *args)
{
co_enable_hook_sys();
stEnv_t *env = (stEnv_t *)args;
while (true)
{
if (env->task_queue.empty())
{
co_cond_timedwait(env->cond, -1);
continue;
}
stTask_t *task = env->task_queue.front();
env->task_queue.pop();
cout << "consume task " << task->id << endl;
free(task);
}
return NULL;
}
int main()
{
stEnv_t *env = new stEnv_t;
env->cond = co_cond_alloc();
stCoRoutine_t *consumer_routine;
// 创建协程
co_create(&consumer_routine, nullptr, Consumer, env);
// 启动协程
co_resume(consumer_routine);
stCoRoutine_t *producer_routine;
co_create(&producer_routine, nullptr, Producer, env);
co_resume(producer_routine);
//创建eventloop,事件循环
co_eventloop(co_get_epoll_ct(), nullptr, nullptr);
return 0;
}
输出:
ubuntu@VM-0-2-ubuntu:~/libco/libco/bin$ ./test1
produce task 0
consume task 0
produce task 1
consume task 1
produce task 2
consume task 2
produce task 3
consume task 3
produce task 4
consume task 4
produce task 5
consume task 5
produce task 6
consume task 6
produce task 7
consume task 7
至于具体是什么可以参照协程专栏的其他博文,这里只介绍协程使用的流程。
首先从main函数开始看,我们可以看到一个结构叫做stCoRuntin_t
,他是co_create
函数的第一个参数。然后由co_create
创建一个协程对象,其中第二个参数为nullptr
,第三个参数是此协程要执行的函数,第四个则是这个函数所需的变量。而创建出来的协程对象也就是协程所需的相关资源。
协程创建之后,调用co_resume
函数去启动这个协程。最后,像线程一样,线程创建后需要调用pthread_join等待子线程退出,而这里我们调用了co_eventloop()函数达到一样的目的。
参考文献
无