#include <stdio.h>
#include <pthread.h>
#include <time.h>
#define NUM_THREADS 4
#define ITERATIONS 1000000
typedef struct {
long value;
char padding[64]; // avoid false sharing
} counter_t;
counter_t counters[NUM_THREADS];
void* increment(void* arg) {
int id = *(int*)arg;
for (int i = 0; i < ITERATIONS; i++) {
counters[id].value++;
}
return NULL;
}
int main() {
pthread_t threads[NUM_THREADS];
int ids[NUM_THREADS];
for (int i = 0; i < NUM_THREADS; i++) {
ids[i] = i;
pthread_create(&threads[i], NULL, increment, &ids[i]);
}
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
printf("Time (optimized): %f seconds\n", (double)(end - start) / CLOCKS_PER_SEC);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDx0aW1lLmg+CgojZGVmaW5lIE5VTV9USFJFQURTIDQKI2RlZmluZSBJVEVSQVRJT05TIDEwMDAwMDAKCnR5cGVkZWYgc3RydWN0IHsKICAgIGxvbmcgdmFsdWU7CiAgICBjaGFyIHBhZGRpbmdbNjRdOyAvLyBhdm9pZCBmYWxzZSBzaGFyaW5nCn0gY291bnRlcl90OwoKY291bnRlcl90IGNvdW50ZXJzW05VTV9USFJFQURTXTsKCnZvaWQqIGluY3JlbWVudCh2b2lkKiBhcmcpIHsKICAgIGludCBpZCA9ICooaW50Kilhcmc7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IElURVJBVElPTlM7IGkrKykgewogICAgICAgIGNvdW50ZXJzW2lkXS52YWx1ZSsrOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCmludCBtYWluKCkgewogICAgcHRocmVhZF90IHRocmVhZHNbTlVNX1RIUkVBRFNdOwogICAgaW50IGlkc1tOVU1fVEhSRUFEU107CgogICAgY2xvY2tfdCBzdGFydCA9IGNsb2NrKCk7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVEhSRUFEUzsgaSsrKSB7CiAgICAgICAgaWRzW2ldID0gaTsKICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkc1tpXSwgTlVMTCwgaW5jcmVtZW50LCAmaWRzW2ldKTsKICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9USFJFQURTOyBpKyspIHsKICAgICAgICBwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7CiAgICB9CgogICAgY2xvY2tfdCBlbmQgPSBjbG9jaygpOwoKICAgIHByaW50ZigiVGltZSAob3B0aW1pemVkKTogJWYgc2Vjb25kc1xuIiwKICAgICAgICAgICAoZG91YmxlKShlbmQgLSBzdGFydCkgLyBDTE9DS1NfUEVSX1NFQyk7CgogICAgcmV0dXJuIDA7Cn0=