libevent 多线程发送数据 bufferevent_write

使用 libevent 

主线程:

	struct event_base*base = event_base_new();

	event_base_dispatch(base);

发送数据线程:

unsigned _stdcall ThreadProc(void* param)
{
	struct bufferevent * bev = (struct bufferevent *)param;

	int iFrameNo = 1;

    char szMsg[512];
    memset( szMsg, 0, sizeof(szMsg) );

	while (1)
	{
		printf("send packet : %d\n", iFrameNo++);

		err = bufferevent_write(bev, szMsg, sizeof(szMsg));
		size_t curlen = evbuffer_get_length(bev->output);

		Sleep(5000);
	}

	return 0;
}

 

这种方式 发送不了 数据。 我的程序 base 放入一个 timeout, 也是以timeout 的 频率 进行。

	struct timeval tv;
	struct event evtPeriod;
	/* Initalize one event */
	event_assign(&evtPeriod, base, -1, EV_PERSIST, time_cb, (void*)bev);

	tv.tv_sec = 5;
	tv.tv_usec = 100*1000;
	evtimer_add(&evtPeriod, &tv);

解决方法:

主线程 需要唤醒。 参见: https://bbs.csdn.net/topics/390523738

timeout 其实进行了 唤醒。

 

需要增加:

#ifdef WIN32
	evthread_use_windows_threads();
#else
	evthread_use_pthreads();
#endif
	evthread_make_base_notifiable(base);
	struct bufferevent*bev = bufferevent_socket_new(base, -1,
		BEV_OPT_CLOSE_ON_FREE | BEV_OPT_THREADSAFE );

增加 BEV_OPT_THREADSAFE 可能会更 可靠。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值