#include <pthread.h>
#include <atomic>
#include <iostream>
#include <sys/time.h>
double dwalltime() {
double sec;
struct timeval tv;
gettimeofday(&tv,NULL);
sec = tv.tv_sec + tv.tv_usec/1000000.0;
return sec;
}
#define ITERATIONS 100000000
int main() {
#ifdef USE_PTHREAD
std::cout << "Using pthread\n";
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
unsigned counter(0);
double start = dwalltime();
for(unsigned i(0); i < ITERATIONS; ++i) {
pthread_mutex_lock(&mutex);
counter++;
pthread_mutex_unlock(&mutex);
}
double end = dwalltime();
std::cout << "It took me: " << (end - start) << " seconds\n";
#else
std::cout << "Using atomic\n";
std::atomic<unsigned> counter(0);
double start = dwalltime();
for(unsigned i(0); i < ITERATIONS; ++i)
counter++;
double end = dwalltime();
std::cout << "It took me: " << (end - start) << " seconds\n";
#endif
}
I2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPGF0b21pYz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KCmRvdWJsZSBkd2FsbHRpbWUoKSB7CiAgICBkb3VibGUgc2VjOwogICAgc3RydWN0IHRpbWV2YWwgdHY7CgogICAgZ2V0dGltZW9mZGF5KCZ0dixOVUxMKTsKICAgIHNlYyA9IHR2LnR2X3NlYyArIHR2LnR2X3VzZWMvMTAwMDAwMC4wOwogICAgcmV0dXJuIHNlYzsKfQoKI2RlZmluZSBJVEVSQVRJT05TIDEwMDAwMDAwMAoKaW50IG1haW4oKSB7CiAgICAjaWZkZWYgVVNFX1BUSFJFQUQKICAgICAgICBzdGQ6OmNvdXQgPDwgIlVzaW5nIHB0aHJlYWRcbiI7CiAgICAgICAgcHRocmVhZF9tdXRleF90IG11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKICAgICAgICB1bnNpZ25lZCBjb3VudGVyKDApOwogICAgICAgIGRvdWJsZSBzdGFydCA9IGR3YWxsdGltZSgpOwogICAgICAgIGZvcih1bnNpZ25lZCBpKDApOyBpIDwgSVRFUkFUSU9OUzsgKytpKSB7CiAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwogICAgICAgICAgICBjb3VudGVyKys7CiAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7CiAgICAgICAgfQogICAgICAgIGRvdWJsZSBlbmQgPSBkd2FsbHRpbWUoKTsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkl0IHRvb2sgbWU6ICIgPDwgKGVuZCAtIHN0YXJ0KSA8PCAiIHNlY29uZHNcbiI7CiAgICAjZWxzZQogICAgICAgIHN0ZDo6Y291dCA8PCAiVXNpbmcgYXRvbWljXG4iOwogICAgICAgIHN0ZDo6YXRvbWljPHVuc2lnbmVkPiBjb3VudGVyKDApOwogICAgICAgIGRvdWJsZSBzdGFydCA9IGR3YWxsdGltZSgpOwogICAgICAgIGZvcih1bnNpZ25lZCBpKDApOyBpIDwgSVRFUkFUSU9OUzsgKytpKQogICAgICAgICAgICBjb3VudGVyKys7CiAgICAgICAgZG91YmxlIGVuZCA9IGR3YWxsdGltZSgpOwogICAgICAgIHN0ZDo6Y291dCA8PCAiSXQgdG9vayBtZTogIiA8PCAoZW5kIC0gc3RhcnQpIDw8ICIgc2Vjb25kc1xuIjsKICAgICNlbmRpZgp9Cg==