libco example_thread.cpp分析

本文分析了libco库中example_thread.cpp的程序,重点探讨了stCoEpoll_t事件循环结构体及其导致的子线程死循环问题。在运行程序时,由于主程序等待子线程完成,但子线程因交替执行导致循环间隔1秒执行两次loop,从而无法正常退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序

/*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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值