#include #include #include #include #include #include "../atomic-queue/atomic.h" volatile unsigned long counter = 0; void *worker(void *arg) { int i = 0; unsigned long *local; local = calloc(1, sizeof(unsigned long)); for (i = 0; i < *((int *)arg); ++i) ++*local; return (void *)local; } int main(int argc, char **argv) { int i, count; unsigned int *ret; pthread_t *t; if (argc != 3) { fprintf(stderr, "%s <#-threads> <#-iterations>\n", argv[0]); return 1; } count = atoi(argv[2]); t = (pthread_t *)calloc(atoi(argv[1]), sizeof(pthread_t)); /* create # threads */ for (i = 0; i < atoi(argv[1]); ++i) assert(!pthread_create(&(t[i]), NULL, worker, (void *)&count)); /* wait for the completion of all the threads */ for (i = 0; i < atoi(argv[1]); ++i) { assert(!pthread_join(t[i], (void **)&ret)); counter += *ret; free(ret); } /* print counter value */ printf("all thread done -> counter=%ld\n", counter); return 0; }