程序
/*demo
./example_thread 1
*/
#include "co_routine.h"
#include "co_routine_inner.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <pthread.h>
#include <unistd.h>
int loop(void *)
{
return 0;
}
static void *routine_func( void * )
{
stCoEpoll_t * ev = co_get_epoll_ct(); //ct = current thread,获取(当前线程中)协程环境中的epoll实例
co_eventloop( ev,loop,0 );
return 0;
}
int main(int argc,char *argv[])
{
int cnt = atoi( argv[1] );//ascii to int,在stdlib.h中
pthread_t tid[ cnt ];//创建cnt个线程变量
for(int i=0;i<cnt;i++)
{
pthread_create( tid + i,NULL,routine_func,0);//创建线程
}
for(;;) //死循环,为了让线程一直运行?
{
sleep(1);
}
return 0;
}
主要的数据结构
stCoEpoll_t事件循环结构体
struct stCoEpoll_t
{
int iEpollFd; //epoll文件号,跟co_poll搭配(见后面的讲解),后面用co_epollwait函数从中取active事件。
static const int _EPOLL_SIZE = 1024 * 10;
struct stTimeout_t *pTimeout;//时间轮
struct stTimeoutItemLink_t *pstTimeoutList;//timeout链表 结构体:只有head,tail。
struct stTimeoutItemLink_t *pstActiveList;
//active链表,每次eventloop后把所有active事件处理完毕后此链表为空,包含两部分事件:1.epoll就绪事件、2.时间轮超时事件。
co_epoll_res *result;
};
程序修改;
#include "co_routine.h"
#include "co_routine_inner.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <pthread.h>
#include <unistd.h>
using namespace std;
int loop(void *)
{
sleep(1);
cout<<__func__<<endl;
return 0;
}
static void *routine_func( void * )
{
cout<<__func__<<" start"<<endl;
stCoEpoll_t * ev = co_get_epoll_ct(); //ct = current thread
for(int i=0;i<5;i++)
cout<<"for "+<<i<<endl;
co_eventloop( ev,loop,0 );
cout<<__func__<<" end"<<endl;
return 0;
}
int main(int argc,char *argv[])
{
cout<<__func__<<" start"<<endl;
int cnt = atoi( argv[1] );
pthread_t tid[ cnt ];
for(int i=0;i<cnt;i++)
{
pthread_create( tid + i,NULL,routine_func,0);
}
cout<<__func__<<" end"<<endl;
pthread_exit(NULL);
return 0;
}
运行./examaple_thread 2
main start
routine_func start
routine_func start
for 0
for 1
for 2
for 3
for 4
main end
for 0
for 1
for 2
for 3
for 4
main end
for 0
for 1
for 2
for 3
for 4
routine_func start
for 0
for 1
for 2
for 3
for 4
loop
loop
然后程序死循环。原因是main一直在等两个子线程执行完毕,而实际上子线程一直在交替,永远不会退出。一直每隔1s执行两次loop。