Skip to content

Instantly share code, notes, and snippets.

@rlabbe
Created October 19, 2016 01:31
Show Gist options
  • Save rlabbe/cb6004fa545535e18ea0fee1158b8cea to your computer and use it in GitHub Desktop.
Save rlabbe/cb6004fa545535e18ea0fee1158b8cea to your computer and use it in GitHub Desktop.
c++ pipelining
void foo1(HANDLE start, HANDLE end, vector<Data>* data_queue, int index)
{
int id = index;
vector<Data>* data = data_queue;
while (true) {
WaitForSingleObject(start, INFINITE);
ResetEvent(start);
Data& d = (*data)[index++];
if (index >= data->size())
index = 0;
//cerr << id;// << " " << d.i << " " << d.d << endl;
d.i += 1;
SetEvent(end);
}
}
void foo2(HANDLE start, HANDLE end, vector<Data>* data_queue, int index)
{
int id = index;
vector<Data>* data = data_queue;
while (true) {
WaitForSingleObject(start, INFINITE);
ResetEvent(start);
Data& d = (*data)[index++];
if (index >= data->size())
index = 0;
//cerr << id;// << " " << d.i << " " << d.d << endl;
d.d += 1;
SetEvent(end);
}
}
void test()
{
vector<Data> data;
data.push_back(Data(1, .3));
data.push_back(Data(7, .1));
HANDLE s1 = CreateEvent(0, TRUE, FALSE, 0);
HANDLE e1 = CreateEvent(0, TRUE, FALSE, 0);
HANDLE s2 = CreateEvent(0, TRUE, FALSE, 0);
HANDLE e2 = CreateEvent(0, TRUE, FALSE, 0);
thread ta(foo1, s1, e1, &data, 0);
thread tb(foo2, s2, e2, &data, 1);
HANDLE events[2] ={ e1, e2 };
auto start = chrono::high_resolution_clock::now();
int N = 100000;
for (int i = 0; i < N; i++) {
SetEvent(s1);
SetEvent(s2);
WaitForMultipleObjects(2, events, TRUE, INFINITE);
ResetEvent(e1);
ResetEvent(e2);
}
auto now = chrono::high_resolution_clock::now();
auto time_span = chrono::duration_cast<chrono::duration<double>>(now - start);
cerr << "calls/sec: " << N / time_span.count() << endl;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment