Created
October 19, 2016 01:31
-
-
Save rlabbe/cb6004fa545535e18ea0fee1158b8cea to your computer and use it in GitHub Desktop.
c++ pipelining
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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