这是第2种方式,追踪boost/asio源码找到的一种线索,使用事件通知:
//server.cpp
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, L"MyEvent");
if (hEvent != NULL)
{
int count = 0;
while (count++ < 5)
{
cout << "waiting..." << endl;
WaitForSingleObject(hEvent, INFINITE);
cout << "event activated:" << count<< endl;
ResetEvent(hEvent);//event un-activate
}
}
return 0;
}
//client.cpp
#include <iostream>
#include <windows.h>
#include <string>
#include <future>
#include <chrono>
using namespace std;
int main()
{
HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, NULL, L"MyEvent");
if (hEvent != NULL)
{
int count = 0;
while (count++ < 5)
{
std::this_thread::sleep_for(std::chrono::milliseconds(2500));
SetEvent(hEvent);//activate event
cout << "+" << endl;
}
}
cout << "done" << endl;
system("pause");
return 0;
}
看似很简单,但结合file_map_memory类似的共享内存方法,可以实现无锁同步,只要写入或读出数据之后,结合超时,server可以同步或异步发送事件,client同样也可以同步或异步操作。也就是客户端或服务端都可以主动发送事件,或者实现被动超时轮询,都可以。更可以实现一对多,多对一的进程操作(比如一个shared_container和多个event)…关键是,只要设计得当,都可以实现无锁的共享。
第二种方法特点:灵活。适合无锁设计、速度其次,大容量数据传递。