int pthread_create(pthread_t *thread,const pthread_attr_t *attr, void*(*start_routine) (void *), void *arg);
void *thread(void *vargp);
/* Global shared variable */
volatile long cnt = 0; /* Counter */
sem_t mutex;
int sem_init(sem_t *s,0,unsigned int val);
void P(sem_t *s);
void V(sem_t *s);
int main(int argc, char **argv)
{
long niters;
int i, nthreads;
pthread_t tid[1000];
niters = atoi(argv[1]);
nthreads = atoi(argv[2]);
for (i=0; i < nthreads; i++)
{
sem_init(&mutex,0,1);
pthread_create(&tid[i], NULL, thread, &niters);
printf("THREAD %d with tid= %ld CREATED \n", i, tid[i]);
}
for (i=0; i < nthreads; i++)
{
pthread_join(tid[i], NULL);
printf("THREAD %d with tid= %ld TERMINATED \n", i, tid[i]);
}
/* Check result */
if (cnt != (nthreads * niters))
printf("BOOM! cnt=%ld --- RACE CONDITION\n", cnt);
else
printf("OK cnt=%ld\n", cnt);
printf("PRESS CTRL-C to terminate or CTRL-Z to suspend \n");
pause();
exit(0);
}
/* Thread routine */
void *thread(void *vargp)
{
long i, niters = *((long *)vargp);
for (i = 0; i < niters; i++)
{
P(&mutex);
cnt++;
V(&mutex);
}
return NULL;
}
Я хочу синхронизировать потоки с помощью семафоров, но когда я объявляю функцию sem_init()
и задаю средний аргумент 0, это выдает мне ошибку.Может быть, функция неправильная.Я также включил заголовок semaphore.h
.
Пожалуйста, предложите решение.