#include #include #include #include #include #define PMAX (100) volatile static int counter = 0; sem_t lock; void * worker(void *arg) { int i; sem_wait(&lock); for (i = 0; i < 1e6; i++) counter++; sem_post(&lock); return NULL; } int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "usage: sem-lock \n"); exit(1); } int threads = atoi(argv[1]); if (threads > PMAX) { fprintf(stderr, "%d threads is the max\n", PMAX); exit(1); } pthread_t pid[PMAX]; sem_init(&lock, 0, 1); printf("begin\n"); int i; for (i = 0; i < threads; i++) pthread_create(&pid[i], NULL, worker, NULL); for (i = 0; i < threads; i++) pthread_join(pid[i], NULL); printf("counter: %d\n", counter); return 0; }