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 可能会更 可靠。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章