#include #include #define NTHREADS 4 #define NINCS 1000 typedef struct { int val; pthread_mutex_t mtx; } ctr_t; void ctr_init(ctr_t *c) { c->val = 0; pthread_mutex_init(&c->mtx, NULL); } void ctr_inc(ctr_t *c) { pthread_mutex_lock(&c->mtx); c->val++; pthread_mutex_unlock(&c->mtx); } int ctr_get(ctr_t *c) { pthread_mutex_lock(&c->mtx); int v = c->val; pthread_mutex_unlock(&c->mtx); return v; } void *worker(void *arg) { (void)arg; ctr_t *c = arg; for (int i = 0; i < NINCS; i++) ctr_inc(c); return NULL; } int main(void) { ctr_t c; ctr_init(&c); pthread_t th[NTHREADS]; for (int i = 0; i < NTHREADS; i++) pthread_create(&th[i], NULL, worker, &c); for (int i = 0; i < NTHREADS; i++) pthread_join(th[i], NULL); printf("Final counter: %d\n", ctr_get(&c)); pthread_mutex_destroy(&c.mtx); return 0; }