/* * Copyright (C) NAKAMURA Minoru */ #include #include #include #include #include #include enum { THREADS = 2 }; static pthread_t threads[THREADS]; static int semid; union semun { int val; struct semid_ds *buf; unsigned short *array; struct seminfo *__buf; }; static void* routine(void* p) { int id = (int)p; int i, j, k; for (;;) { struct sembuf sb = {0, -1, 0}; if (semop(semid, &sb, 1)) { perror("semop"), exit(2); } printf("Thread-ID: %d\n", id); sched_yield(); sb.sem_op = 1; if (semop(semid, &sb, 1)) { perror("semop"), exit(2); } } } int main(int argc, char** argv) { int i; union semun arg; if ((semid = semget(IPC_PRIVATE, 1, 0666)) == 1) { perror("semget"), exit(1); } arg.val = 1; if (semctl(semid, 0, SETVAL, arg)) { perror("semctl"), exit(1); } for (i=0 ; i