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

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