#include <stdio.h>
#include <pthread.h>
#define THREADS 5
int shared = 0;
pthread_mutex_t lock;
void* increment(void* arg) {
for(int i = 0; i < 100000; i++) {
pthread_mutex_lock(&lock);
shared++;
pthread_mutex_unlock(&lock);
}
return NULL;
}
int main() {
pthread_t threads[THREADS];
pthread_mutex_init(&lock, NULL);
for(int i = 0; i < THREADS; i++) {
pthread_create(&threads[i], NULL, increment, NULL);
}
for(int i = 0; i < THREADS; i++) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&lock);
printf("Final value of shared variable = %d\n", shared
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CgojZGVmaW5lIFRIUkVBRFMgNQoKaW50IHNoYXJlZCA9IDA7CnB0aHJlYWRfbXV0ZXhfdCBsb2NrOwoKdm9pZCogaW5jcmVtZW50KHZvaWQqIGFyZykgewogICAgZm9yKGludCBpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7CiAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZsb2NrKTsKICAgICAgICBzaGFyZWQrKzsKICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbG9jayk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKaW50IG1haW4oKSB7CiAgICBwdGhyZWFkX3QgdGhyZWFkc1tUSFJFQURTXTsKCiAgICBwdGhyZWFkX211dGV4X2luaXQoJmxvY2ssIE5VTEwpOwoKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBUSFJFQURTOyBpKyspIHsKICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkc1tpXSwgTlVMTCwgaW5jcmVtZW50LCBOVUxMKTsKICAgIH0KCiAgICBmb3IoaW50IGkgPSAwOyBpIDwgVEhSRUFEUzsgaSsrKSB7CiAgICAgICAgcHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpOwogICAgfQoKICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbG9jayk7CgogICAgcHJpbnRmKCJGaW5hbCB2YWx1ZSBvZiBzaGFyZWQgdmFyaWFibGUgPSAlZFxuIiwgc2hhcmVkKTsKCiAgICByZXR1cm4gMDsKfQ==