Skip to content

Instantly share code, notes, and snippets.

@cameron314
Last active November 26, 2023 01:44
Show Gist options
  • Save cameron314/4728904 to your computer and use it in GitHub Desktop.
Save cameron314/4728904 to your computer and use it in GitHub Desktop.
Simple stability test that I whipped up for exercising my lock-free queue. Compile with g++ -std=c++11 -DNDEBUG stabtest.cpp -O3 -pthread
#include "readerwriterqueue.h"
using namespace moodycamel;
#include <exception>
#include <fstream>
#include <thread>
#include <cstdlib> // rand()
#include <unistd.h> // usleep()
void unpredictableDelay(int extra = 0)
{
/* if ((rand() & 4095) == 0) {
usleep(2000 + extra); // in microseconds
}*/
}
int main(int argc, char** argv)
{
std::ofstream log("log.txt");
try {
for (unsigned int i = 0; true; ++i) {
log << "Test #" << i << std::endl;
ReaderWriterQueue<unsigned long long> q((rand() % 32) + 1);
std::thread writer([&]() {
for (unsigned long long j = 0; j < 1024ULL * 1024ULL * 32ULL; ++j) {
unpredictableDelay(500);
q.enqueue(j);
}
});
std::thread reader([&]() {
unsigned long long element;
for (unsigned long long j = 0; j < 1024ULL * 1024ULL * 32ULL;) {
if ((j & (1024 * 1024 * 16 - 1)) == 0) {
log << " ... iteration " << j << std::endl;
}
unpredictableDelay();
if (q.try_dequeue(element)) {
if (element != j) {
log << " ERROR DETECTED: Expected to read " << j << " but found " << element << std::endl;
}
++j;
}
}
if (q.try_dequeue(element)) {
log << " ERROR DETECTED: Expected queue to be empty" << std::endl;
}
});
writer.join();
reader.join();
}
}
catch (std::exception const& ex) {
log << " ERROR DETECTED: Exception thrown: " << ex.what() << std::endl;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment